当我将dict分配给另一个变量时,为什么Python会更新这两个变量?

时间:2014-02-24 12:07:56

标签: python

如何在使用词典时避免以下情况

a={'b':1}
c=a
c.update({'b':2})
print a # {'b':2}
print c # {'b':2}

4 个答案:

答案 0 :(得分:3)

使用字典copy - 方法。像这样:

>>> a = {'b': 1}
>>> c = a.copy()
>>> c.update({'b': 2})
>>> print a
{'b': 1}
>>> print c
{'b': 2}
>>> 

请注意,这是副本。因此,如果您的字典中有可变对象(字典,列表等),它将复制对这些对象的引用。在这种情况下,您应该使用copy.deepcopy。示例如下:

>>> import copy
>>> a = {'b': {'g': 4}}
>>> c = copy.deepcopy(a)
>>> c['b'].update({'g': 15})
>>> print a
{'b': {'g': 4}}
>>> print c
{'b': {'g': 15}}

答案 1 :(得分:0)

尝试:

c = a.copy()

另见这一个: Deep copy of a dict in python

它允许您通过词典中的值列表进行复制

答案 2 :(得分:0)

变量ac都引用相同的dict对象,因此当您通过变量c进行变异时,底层 dict对象会发生变化。当a指向同一个对象时,也会从那里看到这些更改。

如果您希望ac引用彼此独立的字典,则需要复制字典,以便您实际收到两个独立的对象。您可以使用dict.copy

来实现
a = {'b': 1}
c = a.copy()
c.update({'b': 2})

print a # {'b': 1}
print c # {'b': 2}

请注意,这只会创建一个浅拷贝,所以如果字典包含可变对象 - 如另一个字典,列表或其他一些对象 - 那么你所有副本将再次引用相同的底层对象(就像你的原始代码一样) 。如果您想避免这种情况,可以创建a deep copy of the dictionary

import copy
a = {'b': {'c': 1}}
b = copy.deepcopy(a)
b['b'].update({'c': 2})

print a # {'b': {'c': 1}}
print b # {'b': {'c': 2}}

答案 3 :(得分:0)

显然你的问题已得到解答。但是,这可能有助于纠正你的心理模型。

在Python中,变量不是存储值,而是名称值。查看this article以查看指向酒店的雕像示例。

检查您是否引用同一对象的快速简便方法是打印变量的ID:

>>> a = {}
>>> b = a
>>> print(id(a), id(b))
12345 12345