Python通过分配复制?

时间:2010-03-13 15:47:49

标签: python

我希望以下代码只是初始化dict_adict_bdict_c词典。但它接触到了副本:

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

print dict_a
print dict_b
print dict_c

如您所见,结果如下:

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

为什么该程序会提供以前的结果,当我希望它返回时:

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

5 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分:8)

即使

>>> 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)]

警告:请勿使用[{} for x in range(6)]

答案 2 :(得分:2)

正如danben先前所说,你只是将同一个dict复制到3个变量中,这样每个变量都会引用同一个对象。

要获得所需的行为,您应该在每个变量中实现不同的dict:

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

答案 3 :(得分:1)

您的第一个作业将相同的词典对象分配给变量dict_a,dict_b和dict_c。它相当于dict_c = {}; dict_b = dict_c; dict_a = dict_c。

答案 4 :(得分:0)

我同意以上所说。这里的关键是,在Python中,赋值表示对该对象的引用。 我试图自己理解这个概念,我认为了解在什么情况下创建新对象以及何时更改现有对象很重要。

在上面的示例中,该行:

dict_c['hello'] = 'goodbye'

不会创建新对象。只会更改dict_a,dict_b和dict_c引用的对象。

相反,您写了:

dict_c = {'hello': 'goodbye'}

它将创建一个新对象,该对象将由dict_c引用。 Dict_a和dict_b仍将指向空对象。

在这种情况下,如果您运行:

print dict_a
print dict_b
print dict_c

您将得到:

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