每次学习一个新的数据类型,都需要写一堆,从创建,修改,删除,访问以及相关基础函数来介绍,比如元组,列表,字符串等…..今天要记录的是字典,其实字典并不是一个数据类型,而是一个映射类型,类似于数据结构,操作系统提到的hash,是一个类似索引的东东。
今天就从:创建,修改,删除,访问基础函数四个大块来基本介绍字典叭~
dictnull={}
#花括号是字典的典型符号,就类似于:逗号是元组的典型;[]是列表的典型....
dict1= {'李宁':'一切皆有可能', '耐克':'just do it'}
print('李宁的口号:', dict1['李宁'])
dict2={1:'one', 2:'two'}
print('1的英文: ', dict2[1])
dict3=dict((('A',70),('B',80),('C',67))) #(('A',70),('B',80),('C',67))是一个元组
print(dict3)
dict4=dict(yhr='1',aka='2')
print(dict4)
dict5={}
dict5.fromkeys((1,2,3)) #仅仅是创建新的,并没有改变dict5本身
print(dict5)
dict5=dict5.fromkeys((1,2,3)) #赋值后才算改变dict5本身
print(dict5)
dict5=dict5.fromkeys((1,2,3), 0)
print(dict5)
dict5=dict5.fromkeys((1,2,3),('哈哈哈','赞赞赞','咳咳咳'))
#全部值会分配给每个键,而并不是值每个对应分配一个
print(dict5)
dict5=dict5.fromkeys((1,3),'数字')
print(dict5)
#先创建一个字典
dict4=dict(yhr='1',aka='2')
print(dict4)
#修改一个字典,直接给字典键赋值
dict4['foyn']='3'
dict4['yhr']='0'
print(dict4)
#先创建一个字典
dict5=dict(yhr='1',aka='2')
print(dict5)
#修改一个字典,利用一个字典或者映射关系 去更新另外一个字典
b = {'小白':'dog','yhr':'3'}
dict5.update(b)
print(dict5)
可以看出,update方法的入口参数是一个字典;效果仅仅是在源字典上修改新增,不会全盘覆盖。
dict5=dict5.fromkeys((1,2,3),'numbers')
print(dict5)
#将dict5赋值给dict6
dict6=dict5
print('dict5',dict5)
print('dict6',dict6)
#使用={} 方法,不能级联删除
dict5={}
print('dict5={}',dict5)
print('dict6',dict6)
dict5=dict5.fromkeys((1,2,3),'numbers')
print(dict5)
#将dict5赋值给dict6
dict6=dict5
print('dict5',dict5)
print('dict6',dict6)
#使用clear 方法,能级联删除
dict5.clear()
print('dict5.clear()',dict5)
print('dict6',dict6)
dict5=dict5.fromkeys((1,2,3,4,5,6,7),'numbers')
print(dict5)
dict5.pop(2)
print(dict5)
#没有顺序,随机弹出
dict5.popitem()
print(dict5)
dict5=dict5.fromkeys((1,2,3),'fangwen')
print(dict5)
#访问项,根据键 返回值
print(dict5[1])
访问不存在的项,报错:
#访问不存在的项,报错
print(dict5[0])
File "D:/pyTest/zidian.py", line 83, in
print(dict5[0])
KeyError: 0
dict5=dict5.fromkeys((1,2,3),'fangwen')
print(dict5)
print(dict5.get(6))
#也可以设置找不到的情况处理
print(dict5.get(6,'木有'))
dict5=dict(yhr='1',aka='2')
print(dict5)
dict5.setdefault('aka','seven')
print(dict5)
dict5.setdefault(7,'seven')
print(dict5)
dict5=dict5.fromkeys((1,2,3),'fangwen')
print(dict5)
print((6 in dict5))
print((6 not in dict5))
dict5=dict5.fromkeys(range(5),'赞')
print(dict5)
for eachKey in dict5.keys():
print(eachKey)
for eachValue in dict5.values():
print(eachValue)
for eachItem in dict5.items():
print(eachItem)
a={1:'one',2:'two'}
b=a.copy() #浅拷贝copy()
c=a #赋值
print(a)
print(b)
print(c)
对象看起来,abc完全一样,那下面我们从地址来区分copy()方法和 赋值的区别:
print('a:', id(a))
print('b:', id(b))
print('c:', id(c))
可以看出,经过浅拷贝的b地址,与原先的a,指向不同的地址;然而c与a却指向相同的地址;
尝试修改c,监视abc的变化:
c[4]='four'
print(a)
print(b)
print(c)
可以看出b不受c影响,但是a与c同步变化,再次印证了:
c={}
print(a)
print(b)
print(c)
但是用clear()方法则级联删除:
c.clear()
print(a)
print(b)
print(c)
确实上文提过简单的置空和clear方法,在简单的赋值情况下,一个可级联删除,一个不可;但是如果ac真的是指向同一个地址,用c-like语言的知识,修改的c,岂不是a不管怎么也会修改的,为何这里c={}操作后,a不变呢?
希望看到这里的小伙伴有想法的话能和我一起探讨一下,希望这个疑惑终会被解答….
不出一会儿就有热心的WUZA同学为我指点迷津了:
当c={}时,c执行了赋值操作,相当于指针指向了别的地址,c与a关系分开:
c={}
print(a)
print(b)
print(c)
print('a:', id(a))
print('b:', id(b))
print('c:', id(c))
但是执行clear操作时,仅仅是使用了内置函数,并没有改变c的地址,c与a仍然指向同一个地址,所以改变是同步的!