Python在赋值时会复制对象吗?

64 投票
5 回答
66636 浏览
提问于 2025-04-15 20:23

当我尝试这段代码时:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print(dict_a)
print(dict_b)
print(dict_c)

我原本以为它只是会初始化 dict_adict_bdict_c 这几个字典,然后在 dict_c 中赋值一个键,结果应该是:

{}
{}
{'hello': 'goodbye'}

但似乎出现了一个复制的效果:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

这是为什么呢?

5 个回答

1

正如danben之前所说,你只是把同一个字典复制到了三个变量里,这样每个变量实际上都指向了同一个对象。

如果你想要不同的行为,你应该在每个变量中创建一个不同的字典:

>>> dict_a, dict_b, dict_c = {}, {}, {}
>>> dict_c['hello'] = 'goodbye'
>>> print dict_a
{}
>>> print dict_b
{}
>>> print dict_c
{'hello': 'goodbye'}
>>>
10

虽然

>>> dict_a, dict_b, dict_c = {}, {}, {}

在大多数情况下,这种写法是正确的,但当数量超过3个时,看起来就有点奇怪了。

想象一下

>>> a, b, c, d, e, f = {}, {}, {}, {}, {}, {}

在我想要初始化超过3个东西的时候,我会使用

>>> a, b, c, d, e, f, = [dict() for x in range(6)]
60

这是因为在Python中,变量(名字)实际上只是指向具体对象的引用。当你写 dict_a = dict_b 时,实际上是把 dict_b 的内存地址(或者说指针)复制给了 dict_a。这样的话,dict_adict_b 还是指向同一个字典。

如果你想要不同的行为,可以使用 dict.copy 方法,或者如果你的字典里面可能有嵌套的字典或者其他嵌套对象,可以使用 copy.deepcopy

>>> a = {1:2}
>>> b = a.copy()
>>> b
{1: 2}
>>> b[3] = 4
>>> a
{1: 2}
>>> b
{1: 2, 3: 4}
>>> 

撰写回答