如何在使用词典时避免以下情况
a={'b':1}
c=a
c.update({'b':2})
print a # {'b':2}
print c # {'b':2}
答案 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)
答案 2 :(得分:0)
变量a
和c
都引用相同的dict对象,因此当您通过变量c
进行变异时,底层 dict对象会发生变化。当a
指向同一个对象时,也会从那里看到这些更改。
如果您希望a
和c
引用彼此独立的字典,则需要复制字典,以便您实际收到两个独立的对象。您可以使用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