Python在赋值时会复制对象吗?
当我尝试这段代码时:
dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'
print(dict_a)
print(dict_b)
print(dict_c)
我原本以为它只是会初始化 dict_a
、dict_b
和 dict_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_a
和 dict_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}
>>>