python list append方法不返回预期的结果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python list append方法不返回预期的结果?相关的知识,希望对你有一定的参考价值。
这是代码:
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}]
这是怎么发生的?
答案
字典无法保存重复键。如果您尝试添加重复项,则会将最后添加的值添加到密钥中。
>>> 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())
另一答案
字典不能有相同的键。所以,每次你做data['snm'] = i
,你都在取代价值。此外,您的append
每次都会添加相同的字典,而不是副本。所以,你的列表没有5个字典,它有5个引用同一个字典。而且,当它发生变化时,列表中的所有位置都会发生变化。
简短修复:每次添加一个新的dict
for i in range(5):
atho.append({'snm': i})
另一答案
试试这个:
def appd():
atho = []
for i in range(5):
atho.append({'snm':i})
return atho
如果您一次又一次地重复使用相同的对象,则只需更新其内容即可。诀窍是要显式复制对象或创建一个新对象。您不能简单地保持重写相同的键并期望不同的值
另一答案
您实际上是在附加原始字典的引用。您看到的结果是循环的最后一次迭代,更新字典,从而更新列表中的所有引用。
使用atho.append(data.copy())
将起作用。
另一答案
您是一次又一次地插入相同的字典,而不是插入一个键为snm的新字典。
在范围的每次迭代中,您正在更新字典的值,因此它会更新列表中的所有元素,因为它们都指向相同的字典实例。
您必须在每次迭代时创建一个新字典,然后插入它。
以上是关于python list append方法不返回预期的结果?的主要内容,如果未能解决你的问题,请参考以下文章