当两个字典一起实例化时,更新一个会影响另一个。为什么?

When two dictionaries are instantiated together, updating one affects the other. Why?

抱歉,如果这个问题之前已经发布过,但我很难找到这个问题的答案。
当字典实例化如下时:

foo = bar = {'a': 0}

foo = {'a':0}
bar = foo

更新一个字典会影响另一个:

foo['a'] += 1
print(foo)
// {'a': 1}
print(bar)
// {'a': 1}

然而当它们被单独实例化时:

foo = {'a':0}
bar = {'a':0}

foo['a'] += 1
print(foo)
// {'a':1}
print(bar)
// {'a':0}

但是,当以类似方式实例化变量时:

foo = bar = 0
foo += 1
print(foo)
// 1
print(bar)
// 0

首先,这里发生了什么?设置的变量是否等于同一个字典对象?
其次,如何将字典复制到另一个变量并更新第二个变量而不影响第一个变量?例如,我试图将类似的词典附加到列表中,但更改了一个键值:

dic = {"foo":0,"bar":1}
list1 = [1,2,3,4]
list2 = []
for num in list1:
     temp = dic
     temp["bar"] = num
     list2.append(temp)
print(list2)
// [{"foo":0,"bar":4},{"foo":0,"bar":4},{"foo":0,"bar":4},{"foo":0,"bar":4}]

在此示例中,执行以下操作相当容易:

list1 = [1,2,3,4]
list2 = []
for num in list1:
     list2.append({'foo':0,'bar':num})
print(list2)
// [{"foo":0,"bar":1},{"foo":0,"bar":2},{"foo":0,"bar":3},{"foo":0,"bar":4}]

但是对于一个有很多键的字典,有没有一种方法可以在不对新字典进行硬编码的情况下做到这一点?

谢谢!

那是因为当你将可变变量(比如包含dict、list等的变量)赋值给另一个变量(或者你将它传递给一个函数)时,它是通过引用传递的,而不是通过值传递的。这意味着变量存储对象的 reference,而不是实际值。另一方面,像 int、str、float 等常量是按值传递的。这意味着制作了它们的副本。如果你想按值传递一个可变项,你需要像这样用 copy.deepcopy 复制它:

import copy
my_dict = {"a": 1, "b": 2}
my_copy_dict = copy.deepcopy(my_dict)

现在,当您将 my_dict 更改为 my_copy_dict 时,它们将不会同步。