Python附加循环工作之谜

时间:2016-02-01 21:05:02

标签: python

当我在“for in”循环中尝试填充列表时,我发现了一些“神秘”问题。

以下是示例:

>>> params = [1,2,3,4,5]
>>> el = {'param':0}
>>> el
{'param': 0}
>>> list = []
>>> for param in params:
...     el['param'] = param
...     list.append(el)
... 
>>> print(list)
[{'param': 5}, {'param': 5}, {'param': 5}, {'param': 5}, {'param': 5}]
>>> 

但我认为结果应该是

>>> print(list)
[{'param': 1}, {'param': 2}, {'param': 3}, {'param': 4}, {'param': 5}]
>>> 

如何解决此问题?为什么真正的结果与我心中的结果不相似?

5 个答案:

答案 0 :(得分:3)

列表中的每个元素都包含对相同 dict的引用。这就是为什么你在每个元素中看到相同的数字。也许你想做:

params = [1,2,3,4,5]

a = []
for param in params:
    el = {'param': param}
    a.append(el)

另外,请注意使用变量名隐藏内置文件,例如list

答案 1 :(得分:2)

el始终引用相同的字典,list.append(el)引用添加到该字典,而不是其当前值的副本到列表中。您没有5个不同词典的列表,但列出了5个对一个词典的引用。

要详细了解详细情况,请每次循环播放listel。您会看到一个不断增长的列表,它总是引用el的当前值。

答案 2 :(得分:1)

问题是您对列表中的每个条目使用相同的字典。要解决此问题,请在for循环中将el = {}添加到el['param'] = param以上。

答案 3 :(得分:1)

您在每次迭代中修改相同的dict并将其添加到list。将此dict的副本添加到list时,您将获得其他结果。

只需拨打list.append(dict(el))即可。

答案 4 :(得分:0)

您正在修改一个dict对象。您可以多次向列表添加对该dict的引用。因此,您的列表包含对同一个dict对象的5个引用。