小能豆

Python 在分配时会复制对象吗?

python

当我尝试此代码时:

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'}

为什么?


阅读 40

收藏
2024-06-27

共1个答案

小能豆

出现此问题的原因是,该语句dict_a = dict_b = dict_c = {}不会创建三个单独的字典。相反,它使dict_adict_bdict_c都引用同一个字典对象。当您通过一个引用修改字典时,更改会反映在所有引用中,因为它们都指向内存中的同一个对象。

以下是具体发生的步骤:

  1. dict_a = dict_b = dict_c = {}:这将创建一个空字典,并将对它的引用分配给dict_adict_bdict_c
  2. dict_c['hello'] = 'goodbye':这将修改所引用的词典dict_c。由于dict_adict_bdict_c都引用同一本词典,因此更改在所有三个引用中都可见。

要创建三个单独的词典,您需要单独分配它们:

dict_a = {}
dict_b = {}
dict_c = {}

dict_c['hello'] = 'goodbye'

print(dict_a)  # Output: {}
print(dict_b)  # Output: {}
print(dict_c)  # Output: {'hello': 'goodbye'}

或者,如果您想创建副本,您可以使用该copy方法:

dict_a = {}
dict_b = dict_a.copy()
dict_c = dict_a.copy()

dict_c['hello'] = 'goodbye'

print(dict_a)  # Output: {}
print(dict_b)  # Output: {}
print(dict_c)  # Output: {'hello': 'goodbye'}

使用该copy方法可以确保dict_bdict_c一开始是浅拷贝,dict_a但是是独立的对象。这样,修改一个字典不会影响其他字典。

2024-06-27