Python 在分配时会复制对象吗?
- 2024-12-04 08:56:00
- admin 原创
- 170
问题描述:
当我尝试此代码时:
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'}
为什么?
参见:
如何克隆列表以使其在分配后不会意外改变?
浅拷贝、深拷贝和普通赋值操作有什么区别?
解决方案 1:
这是因为在 Python 中,变量(名称)只是对单个对象的引用。当您分配 时dict_a = dict_b
,实际上是将内存地址(或指针,如果您愿意的话)从 复制到dict_b
。dict_a
该字典仍然有一个实例。
为了获得所需的行为,请使用dict.copy
方法,或者copy.deepcopy
如果您的字典可能有嵌套字典或其他嵌套对象则使用。
>>> a = {1:2}
>>> b = a.copy()
>>> b
{1: 2}
>>> b[3] = 4
>>> a
{1: 2}
>>> b
{1: 2, 3: 4}
>>>
解决方案 2:
虽然
>>> 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)]
解决方案 3:
您的第一个赋值将相同的字典对象分配给变量 dict_a、dict_b 和 dict_c。它相当于 dict_c = {}; dict_b = dict_c; dict_a = dict_c。
解决方案 4:
正如 danben 之前所说,您只是将同一个字典复制到 3 个变量中,以便每个变量都引用同一个对象。
为了获得所需的行为,您应该在每个变量中实例化一个不同的字典:
>>> dict_a, dict_b, dict_c = {}, {}, {}
>>> dict_c['hello'] = 'goodbye'
>>> print dict_a
{}
>>> print dict_b
{}
>>> print dict_c
{'hello': 'goodbye'}
>>>
解决方案 5:
我同意上面的说法。这里的关键是,在 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'}
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD