我希望以下代码只是初始化dict_a
,dict_b
和dict_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'}
答案 0 :(得分:41)
这是因为在Python中,变量(名称)只是对单个对象的引用。当您指定dict_a = dict_b
时,您实际上是在从dict_b
到dict_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'}