3

我的问题是在将字典更新为列表时。

输入:

>>> res=[]
>>> my_inital_dict={'aa':1,'bb':1}
>>> for i in range(4):
...     my_initial_dict.update({'aa':i+4})
...     print my_initial_dict
...     res.append(my_initial_dict)

我得到的输出:

{'aa': 4, 'bb': 1}
{'aa': 5, 'bb': 1}
{'aa': 6, 'bb': 1}
{'aa': 7, 'bb': 1}
>>> res
[{'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}, {'aa': 7, 'bb': 1}]

当我在循环中打印时my_initial_dict,我得到了正确的值。但是当我打印结果列表时,我会得到重复 4 次相同字典的字典列表。有人可以解释这里发生了什么吗?

4

4 回答 4

4

如前所述, res 列表中的所有项目都引用同一个 object

你:将这个可变对象附加到一个列表中,更改它,然后再次附加它,现在让我看看它是什么样子的。

计算机:将对象添加到列表中,将相同的对象添加到列表中,这是您的列表,其中包含相同的两个对象。

这是另一种说法;首先,您使用对象构建列表,然后显示对象列表,在本例中是同一对象的列表,因此它在列表的每个位置显示该对象的最新状态,而不是状态你添加了它,除非你复制它。

其他方法,只是为了好玩;

使用 lamda嵌套理解或映射,使用 copy() 和 update()

my_inital_dict={'aa':1,'bb':1}
res = [x[1] for x in [(my_inital_dict.update({'aa':i+4}),
       my_inital_dict.copy()) for i in range(4)]]

-或者-

res = map(lambda i: my_inital_dict.update({'aa':i+4}) or my_inital_dict.copy(),
      range(4))
于 2013-07-26T17:50:12.477 回答
2

所有列表项都引用同一个字典对象。制作副本:

res = []
my_initial_dict = {'aa':1,'bb':1}
for i in range(4):
    d = my_initial_dict.copy()
    d['aa'] = i + 4
    print d
    res.append(d)
print res
于 2013-07-26T14:08:29.003 回答
2

您每次都将字典附加到循环中的 res 中,这就是您看到重复的原因。它们都具有相同的值,因为您每次都在更新相同的 dict

res=[]
my_inital_dict={'aa':1,'bb':1}
updates = [my_initial_dict]
for i in range(4):
   updates.append({'aa':i+4})
   my_initial_dict.update({'aa':i+4})
   res = my_initial_dict
print updates
于 2013-07-26T14:07:09.000 回答
1

您每次都在 for 循环中更新相同的字典。由于 python 使用“引用调用”结构,您每次都指向同一个对象并进行相同的更改并将相同的 dict 附加到列表中,即您正在附加相同的对象。

这可以称为对象的软拷贝。如果您想在列表中包含所有更新的字典,则必须进行深层复制。

于 2018-02-20T20:58:42.577 回答