python list append方法不返回预期结果吗?

时间:2018-09-04 12:49:16

标签: python 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}]

这是怎么发生的?

5 个答案:

答案 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的新词典。

在范围的每次迭代中,您都在更新字典的值,因此它会针对列表中的所有元素进行更新,因为它们都指向同一个字典实例。

您必须在每次迭代中创建一个新词典,然后将其插入。