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方法不返回预期的结果?的主要内容,如果未能解决你的问题,请参考以下文章

Python list-append()方法

Python list-append()方法

Python 的常用方法和函数

Python 的常用方法和函数

python append()函数

Python 的list.append()返回值是None