附加到 Python 中的列表:每次都添加最后一个元素?

Posted

技术标签:

【中文标题】附加到 Python 中的列表:每次都添加最后一个元素?【英文标题】:Appending to a list in Python: adds last element every time? 【发布时间】:2015-11-10 12:42:11 【问题描述】:

我想将 dict 附加到列表中,但得到的结果不是我想要的。

我的代码:

records=[]
record=
for i in range(0,2):
  record['a']=i  
  for j in range (0,2):
    record['b']=j
    records.append(record)
print records 

我预计:

['a': 0, 'b': 0, 'a': 0, 'b': 1, 'a': 1, 'b': 0, 'a': 1, 'b': 1]

我得到了:

['a': 1, 'b': 1, 'a': 1, 'b': 1, 'a': 1, 'b': 1, 'a': 1, 'b': 1]

为什么每次只添加最后一个元素?

【问题讨论】:

【参考方案1】:

您正在重复使用和添加一个字典。如果您想要单独的字典,请每次附加一个副本:

records = []
record = 
for i in range(2):
    record['a'] = i  
    for j in range(2):
        record['b'] = j
        records.append(record.copy())

或者每次都新建一个字典:

records = []
for i in range(2):
    for j in range(2):
        record = 'a': i, 'b': j
        records.append(record)

后一种方法适用于翻译成列表理解:

records = ['a': i, 'b': j for i in range(2) for j in range(2)]

【讨论】:

【参考方案2】:

record.copy() 如果您嵌套了字典,它将不起作用,因为它返回浅拷贝。请改用deepcopy,这是完全证明。

from copy import deepcopy
records.append(deepcopy(record))

【讨论】:

以上是关于附加到 Python 中的列表:每次都添加最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

迭代循环并将列表添加到新行或新列中的数据框

Python将元素插入到列表中,每次迭代都不同

按值传递可变对象

Python For循环仅将最后一个值附加到列表

Python for 循环仅将最后一个列表作为值附加

反转附加列表或预先添加列表更便宜吗? - Python