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

时间:2020-05-18 18:06:24

标签: python python-3.x dictionary theory

很抱歉,如果以前已经发布过此问题,但是我很难找到答案。
当实例化字典时,如下所示:

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}]

但是对于具有很多键的字典,有没有办法对新字典进行硬编码?

谢谢!

1 个答案:

答案 0 :(得分:3)

这是因为当您将可变变量(例如包含dict,list等的变量)分配给另一个变量(或将其传递给函数)时,它是按引用传递,而不是按值传递。这意味着该变量存储对该对象的引用,而不是实际值。另一方面,诸如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时,它们都不会同步。