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

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}


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

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


两个变量ac都引用同一个dict对象,因此当您通过变量c对其进行变异时,基础dict对象就会发生变化。由于a指向同一对象,从那里也可以看到这些更改。

如果你想让ac都引用彼此独立的字典,那么你需要复制字典,这样你就可以实际接收到两个独立的对象。您可以通过使用dict.copy来实现这一点:

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的深度复制

它允许您在听写中按值列表进行复制。