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

问题描述 投票:0回答:1

对不起,如果这个问题之前已经发布过,但我一直找不到答案。当字典实例化如下。

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

但是对于一个有很多键的字典 有什么方法可以在不硬编码一个新字典的情况下做到这一点吗?谢谢你!如果这个问题在以前发过,那就不好意思了。

python python-3.x dictionary theory
1个回答
3
投票

这是因为当你把可变变量(如包含dict、list等的变量)分配给另一个变量时(或者你把它传递给一个函数),它是通过引用传递的,而不是通过值传递的。这意味着这个变量存储了一个 参考 到对象,而不是实际值。另一方面,像int、str、float等常量是通过value传递的。这意味着要对它们进行复制。如果你想通过值来传递一个可变的项目,你需要用以下方法复制它 copy.deepcopy 像这样。

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

现在当你改变 my_dictmy_copy_dict 他们都不会同步。

© www.soinside.com 2019 - 2024. All rights reserved.