Python通过分配复制?

Python Copy Through Assignment?

我希望下面的代码只是初始化dict_adict_bdict_c字典。但它有一个复制通过的效果:

1
2
3
4
5
6
dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print dict_a
print dict_b
print dict_c

如您所见,结果如下:

1
2
3
{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

当我期望它返回时,为什么那个程序会给出前面的结果:

1
2
3
{}
{}
{'hello': 'goodbye'}


这是因为在Python中,变量(名称)只是对单个对象的引用。当您分配dict_a = dict_b时,实际上是从dict_bdict_a复制内存地址(或者指针,如果您愿意的话)。那本词典还有一个实例。

要获得所需的行为,请使用dict.copy方法,或者如果dict可能有嵌套dict或其他嵌套对象,则使用copy.deepcopy

1
2
3
4
5
6
7
8
9
10
>>> a = {1:2}
>>> b = a.copy()
>>> b
{1: 2}
>>> b[3] = 4
>>> a
{1: 2}
>>> b
{1: 2, 3: 4}
>>>


尽管

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

在大多数情况下是正确的方法,当它超过3时,看起来很奇怪

想象

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

如果我想初始化3个以上的东西,我使用

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

注意:不要使用[{} for x in range(6)]


正如丹本之前所说,您只是将同一个dict复制到3个变量中,以便每个变量都引用同一个对象。

要获得所需的行为,应在每个变量中声明不同的dict:

1
2
3
4
5
6
7
8
9
>>> dict_a, dict_b, dict_c = {}, {}, {}
>>> dict_c['hello'] = 'goodbye'
>>> print dict_a
{}
>>> print dict_b
{}
>>> print dict_c
{'hello': 'goodbye'}
>>>


您的第一个赋值为变量dict_a、dict_b和dict_c分配相同的dictionary对象。它相当于dict_c=dict_b=dict_c;dict_a=dict_c。