当两个字典一起实例化时,更新一个会影响另一个,为什么?
抱歉如果这个问题之前有人问过,但我一直找不到答案。
当字典以以下方式创建时:
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 个回答
4
这是因为当你把可变变量(比如包含字典、列表等的变量)赋值给另一个变量,或者把它传递给一个函数时,它是通过引用传递的,而不是通过值传递。这意味着这个变量存储的是对象的一个引用,而不是实际的值。另一方面,像整数、字符串、浮点数这些常量是通过值传递的。这意味着会创建它们的一个副本。如果你想通过值传递一个可变的对象,你需要用copy.deepcopy
来复制它,像这样:
import copy
my_dict = {"a": 1, "b": 2}
my_copy_dict = copy.deepcopy(my_dict)
现在,当你把my_dict
改成my_copy_dict
时,它们就不会保持同步了。