首页 >后端开发 >Python教程 >为什么 Python 赋值会在可变对象上显示意外行为?

为什么 Python 赋值会在可变对象上显示意外行为?

DDD
DDD原创
2024-12-07 20:25:16487浏览

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Python 赋值中的复制行为

简介

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.copy():创建一个浅拷贝,复制字典的顶层元素。
  • copy.deepcopy():创建一个深层复制,递归复制对象内的所有嵌套对象

示例:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn