将字典附加到 Python 列表:奇怪的结果?

时间:2021-07-01 05:52:06

标签: python python-3.x

我最近在通过将字典附加到列表来创建字典列表时遇到了一个奇怪的发现。

下面是我的代码:

a = []
    
for i in range(5):
    m = {'a':'apple'}
    a.append(m)
    m['b'] = 'ball'

for i in a:
    print(i)

我预计列表 a 将只包含 'a': 'apple',因为键 b 是在 append 语句之后定义的。

令人惊讶的是,以下是我获得的输出:

{'a': 'apple', 'b': 'ball'}
{'a': 'apple', 'b': 'ball'}
{'a': 'apple', 'b': 'ball'}
{'a': 'apple', 'b': 'ball'}
{'a': 'apple', 'b': 'ball'}

为什么会这样?提前致谢!

1 个答案:

答案 0 :(得分:2)

那是因为python中有两件事:

  1. python 中的 dict 是一个可变对象。在您的代码中,m 是一个 dict,即使它已附加到对象 a。之后它的值仍然可以更新。这也会影响附加到 a 的值。
  2. 函数参数在python中始终由Reference分配。在代码 a.append(m) 中,您不是将 m 的值传递给 append(),而是将 m 的引用传递给它。因此,当您更新 m 的值时,a 的值也会随之更新。

我建议你可以进一步研究python中的可变和不可变对象。