When I assign a dict to another variable, why does Python update both dicts?
本问题已经有最佳答案,请猛点这里访问。
使用词典时如何避免以下情况
1 2 3 4 5 | a={'b':1} c=a c.update({'b':2}) print a # {'b':2} print c # {'b':2} |
使用字典
1 2 3 4 5 6 7 8 | >>> a = {'b': 1} >>> c = a.copy() >>> c.update({'b': 2}) >>> print a {'b': 1} >>> print c {'b': 2} >>> |
请注意,这是一份浅显的副本。因此,如果您的字典中有可变对象(字典、列表等),它将复制对这些对象的引用。在这种情况下,您应该使用copy.deepcopy。示例如下:
1 2 3 4 5 6 7 8 | >>> 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}} |
号
很明显你的问题已经被回答了。但这里可能有帮助的是纠正你的思维模式。
在Python中,变量不存储值,它们命名值。请看这篇文章,以了解指向酒店的雕像的例子。
检查是否引用同一对象的快捷方法是打印变量的ID:
1 2 3 4 | >>> a = {} >>> b = a >>> print(id(a), id(b)) 12345 12345 |
。
两个变量
如果你想让
1 2 3 4 5 6 | a = {'b': 1} c = a.copy() c.update({'b': 2}) print a # {'b': 1} print c # {'b': 2} |
。
请注意,这只会创建一个浅副本,因此如果字典包含可变对象,如另一个字典、列表或其他对象,则所有副本都将再次引用相同的基础对象(就像原始代码一样)。如果要避免这种情况,可以创建字典的深度副本:
1 2 3 4 5 6 7 | 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}} |
尝试:
1 | c = a.copy() |
另请参见本节:python中dict的深度复制
它允许您在听写中按值列表进行复制。