简介
Python 是一种流行的编程语言,当通过赋值运算符 (=) 将对象分配给变量。这种行为通常称为复制,通常会导致意外结果。为了阐明这个概念,让我们看一个常见的例子。
问题:复制与复制
考虑以下代码:
dict_a = dict_b = dict_c = {} dict_c['hello'] = 'goodbye' print(dict_a) print(dict_b) print(dict_c)
人们会期望这段代码创建三个独立的字典,将它们初始化为空,然后仅修改 dict_c。预期的输出应该是:
{} {} {'hello': 'goodbye'}
但是,Python 的复制行为会产生不同的结果:
{'hello': 'goodbye'} {'hello': 'goodbye'} {'hello': 'goodbye'}
解释:引用赋值
理解这种行为的关键在于Python中变量的性质。在Python中,变量(或名称)仅仅是指向存储在内存中的实际对象的指针。将一个变量分配给另一个变量时,赋值运算符 (=) 将内存地址(或指针)从一个变量复制到另一个变量。在我们的示例中:
dict_a = dict_b = dict_c
这意味着 dict_a、dict_b 和 dict_c 都指向内存中的同一个字典对象。因此,当 dict_c 被修改时,所有三个变量都会看到相同的修改,从而产生复制效果。
解决问题:使用复制方法
防止为了实现复制行为,必须显式创建基础对象的副本。 Python 为此提供了两种方法:
示例:
dict_a = dict_b.copy() dict_c = copy.deepcopy(dict_a) dict_c['hello'] = 'goodbye' print(dict_a) # {'hello': 'goodbye'} (shallow copy, affected) print(dict_b) # {} (unaffected) print(dict_c) # {'hello': 'goodbye'} (deep copy, unaffected)
通过使用这些复制方法,我们可以创建对象的独立副本并避免复制行为。
以上是为什么 Python 赋值会在可变对象上显示意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!