【问题标题】:python list append method do not return expected results?python list append方法不返回预期结果?
【发布时间】:2018-09-04 22:54:46
【问题描述】:

这是代码:

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}]

这是怎么发生的?

【问题讨论】:

  • 因为这是一个字典——它只存储不同的键名。并且您总是将 i 的新值分配给同一个键 - 因此所有条目都具有相同的值。
  • 只有一本字典,data。每次,您都更改这个字典,然后将新的引用添加到atho

标签: python append


【解决方案1】:

字典不能有相同的键。因此,每次您执行data['snm'] = i 时,您都在替换该值。此外,您的append 每次都添加相同的 字典,而不是副本。因此,您的列表没有 5 个字典,它有 5 个对同一字典的引用。而且,当它发生变化时,您列表中的所有位置都会发生变化。

短期修复:每次添加一个新的字典

for i in range(5):
   atho.append({'snm': i})

【讨论】:

    【解决方案2】:

    字典不能保存重复的键。如果您尝试添加重复项,则会将最后添加的值添加到键中。

    >>> 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())
    

    【讨论】:

      【解决方案3】:

      您一次又一次地插入同一个字典,而不是插入一个键为 snm 的新字典。

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

      您必须在每次迭代时创建一个新字典,然后插入它。

      【讨论】:

        【解决方案4】:

        试试这个:

        def appd():
            atho = []
            for i in range(5):
                atho.append({'snm':i})
            return atho
        

        如果您一次又一次地重复使用同一个项目,您只是在更新它的内容。诀窍是要么显式复制对象,要么创建一个新对象。您不能简单地继续覆盖相同的键并期望不同的值

        【讨论】:

          【解决方案5】:

          您实际上是在将 reference 附加到原始字典中。 您看到的结果是循环的最后一次迭代更新字典,因此列表中的所有引用。

          使用atho.append(data.copy()) 会起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-07
            • 1970-01-01
            • 2016-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多