这是代码:
def appd():
atho = []
data = {'snm':None}
for i in range(5):
data['snm'] = i
atho.append(data)
return atho
我希望结果将是这样:
[{'snm': 0}, {'snm': 1}, {'snm': 2}, {'snm': 3}, {'snm': 4}]
但是我在python 3平台中得到的结果是:
[{'snm': 4}, {'snm': 4}, {'snm': 4}, {'snm': 4}, {'snm': 4}]
这是怎么发生的?
答案 0 :(得分:2)
字典不能具有相同的键。因此,每次执行data['snm'] = i
时,您都在替换值。另外,您的append
每次都会添加相同的词典,而不是副本。因此,您列出的没有5个字典,它有5个对同一词典的引用。而且,当它更改时,列表的所有位置也会更改。
简短修复:每次添加新的字典
for i in range(5):
atho.append({'snm': i})
答案 1 :(得分:1)
尝试一下:
def appd():
atho = []
for i in range(5):
atho.append({'snm':i})
return atho
如果您一次又一次地重复使用相同的对象,那么您只是在更新它的内容。诀窍是显式复制对象或创建一个新对象。您不能简单地覆盖相同的键并期望使用不同的值
答案 2 :(得分:1)
您实际上是将引用附加到原始词典中。 您看到的结果是循环的最后一次迭代,更新了字典,因此字典中的所有引用都在列表中。
使用atho.append(data.copy())
即可。
答案 3 :(得分:0)
字典不能包含重复的密钥。如果您尝试添加重复项,则会将最后添加的值添加到密钥中。
>>> d = {'a': 1}
>>> d['a'] = 2
>>> d['a'] = 3
>>> d
{'a': 3}
>>>
使用data['snm'] = i
,您基本上在做同样的事情,并且该字典正在使用append
添加到列表中。
要解决此问题,请在循环中定义data = {}
,以便每次创建新字典后都可以追加。
def appd():
atho = []
for i in range(5):
data = {}
data['snm'] = i
atho.append(data)
return atho
print(appd())
答案 4 :(得分:0)
您要一次又一次地插入同一词典,而不是插入密钥为snm的新词典。
在范围的每次迭代中,您都在更新字典的值,因此它会针对列表中的所有元素进行更新,因为它们都指向同一个字典实例。
您必须在每次迭代中创建一个新词典,然后将其插入。