当前位置 : 主页 > 手机开发 > ROM >

向字典中的列表添加新元素时发生异常以及慎用fromkeys创建字典

来源:互联网 收集:自由互联 发布时间:2021-06-10
现有一个字典的每个值都是一个列表,当向其中一个列表添加新元素的时候,其它类型为列表的值也自动添加了该元素.代码如下: lis = [‘lily‘,‘bill‘,‘kite‘,‘dali‘] dic = dict.fromkeys(l

    现有一个字典的每个值都是一个列表,当向其中一个列表添加新元素的时候,其它类型为列表的值也自动添加了该元素.代码如下:

lis = [‘lily‘,‘bill‘,‘kite‘,‘dali‘]
dic = dict.fromkeys(lis,[])
dic[lis[0]] = 100
outer = dic[lis[1]]
outer.append(200)
# dic.setdefault(‘bill‘,[]).append(200)
# dic[lis[1]].append(200)
print(dic)
这里用了3种方式来给这个值添加元素,但是结果都如下

{‘lily‘: 100, ‘bill‘: [200], ‘kite‘: [200], ‘dali‘: [200]}

这个问题不知是不是python本身的问题.经过摸索发现,是否会出现这个异常与字典的建立方式有关,使用这种方式建立的字典会出现这种现象.但是直接写字典或使用列表推导出来的字典都没有这个问题,尽管 进行比较运算的时候,他们的值是相同的.
dic0 = dict.fromkeys(range(5),[])
# dic0 = {x:[] for x in range(5)}
dic1 = {0:[],1:[],2:[],3:[],4:[]}
print(dic0,dic1,dic0 == dic1)
dic0[0] = 100
dic1[0] = 100
dic0[1].append(200)
dic1[1].append(200)
print(dic0,dic1)
这段代码的结果如下:(注释掉的那段也无异常)

{0: [], 1: [], 2: [], 3: [], 4: []} {0: [], 1: [], 2: [], 3: [], 4: []} True
[] []
{0: 100, 1: [200], 2: [200], 3: [200], 4: [200]} {0: 100, 1: [200], 2: [], 3: [], 4: []}

可以看到 两个相同的东西,执行得到的结果并不同,虽然还不知是什么导致的这个问题,但是今后创建新字典最好不用fromkeys这种方法.

网友评论