我设置了dict2 = dict1。当我编辑dict2时,原来的dict1也改变了。为什么?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
我设置了dict2 = dict1。当我编辑dict2时,原来的dict1也改变了。为什么?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
当前回答
Dict1是一个引用底层字典对象的符号。将dict1赋值给dict2只是赋值相同的引用。通过dict2符号更改键的值将更改底层对象,这也会影响dict1。这很令人困惑。
推断不可变值比推断引用要容易得多,所以尽可能地复制:
person = {'name': 'Mary', 'age': 25}
one_year_later = {**person, 'age': 26} # does not mutate person dict
这在语法上是相同的:
one_year_later = dict(person, age=26)
其他回答
你也可以用字典理解来创建一个新字典。这避免了导入副本。
dout = dict((k,v) for k,v in mydict.items())
当然,在python >= 2.7中,你可以这样做:
dout = {k:v for k,v in mydict.items()}
但对于向后比较。,上面的方法更好。
起初,这也让我感到困惑,因为我来自C语言背景。
在C语言中,变量是内存中具有已定义类型的位置。对变量赋值会将数据复制到变量的内存位置。
但在Python中,变量更像是指向对象的指针。因此,将一个变量赋值给另一个变量并不会产生复制,它只是使变量名指向相同的对象。
python中的每个变量(比如dict1或str或__builtins__)都是指向机器内部某个隐藏的柏拉图式“对象”的指针。
如果您设置dict1 = dict2,您只需将dict1指向与dict2相同的对象(或内存位置,或任何您喜欢的类比)。现在,dict1引用的对象就是dict2引用的对象。
你可以检查:dict1是dict2应该是True。另外,id(dict1)应该与id(dict2)相同。
你需要dict1 = copy(dict2),或者dict1 = deepcopy(dict2)。
复制和深度复制的区别是什么?Deepcopy将确保dict2的元素(你是否将它指向一个列表?)也是副本。
我不怎么使用深度复制——编写需要它的代码通常是一种糟糕的实践(在我看来)。
>>> dict2 = dict1
# dict2 is bind to the same Dict object which binds to dict1, so if you modify dict2, you will modify the dict1
复制Dict对象有很多方法,我简单用一下
dict_1 = {
'a':1,
'b':2
}
dict_2 = {}
dict_2.update(dict_1)
Dict1是一个引用底层字典对象的符号。将dict1赋值给dict2只是赋值相同的引用。通过dict2符号更改键的值将更改底层对象,这也会影响dict1。这很令人困惑。
推断不可变值比推断引用要容易得多,所以尽可能地复制:
person = {'name': 'Mary', 'age': 25}
one_year_later = {**person, 'age': 26} # does not mutate person dict
这在语法上是相同的:
one_year_later = dict(person, age=26)