Python赋值机制疑问:基础类型与对象赋值表现为何不同?
Python赋值中的可变与不可变类型差异:为什么修改b会影响a?
这其实是Python中不可变类型和可变类型在赋值时的核心差异导致的,我来给你拆解清楚:
第一个例子:不可变类型(int)的赋值逻辑
- 当你执行
a = 1时,Python会创建一个值为1的整数对象,变量a其实是指向这个对象的"指针"。 - 执行
b = a时,只是让变量b也指向同一个1对象,并没有创建新的对象。 - 但整数属于不可变类型——你无法修改一个整数对象本身的值。当你执行
b = 2时,Python会创建一个新的2对象,然后让b指向这个新对象,而a仍然指向原来的1对象。所以print(a)自然输出1。
第二个例子:可变类型(自定义对象)的赋值逻辑
- 自定义的
Object类属于可变类型,这类对象的属性可以被修改。 - 执行
a = Object()时,创建了一个Object实例,a指向这个实例;a.value = 1是直接修改这个实例的value属性。 b = a同样是让b指向同一个Object实例,此时a和b其实是同一个对象的两个"别名"。- 当你执行
b.value = 2时,本质是修改了这个共享实例的value属性,既然a指向的是同一个实例,a.value自然也会变成2。
如何让a.value保持为1?
要解决这个问题,你需要创建原对象的副本,而不是让b指向同一个对象。这里有几种常用方法:
方法1:在类中手动实现复制方法
给Object类添加一个copy方法,创建一个新的实例并复制属性:
class Object: def __init__(self): self.value = 0 def copy(self): new_obj = Object() new_obj.value = self.value return new_obj a = Object() a.value = 1 b = a.copy() # 创建原对象的副本 b.value = 2 print(a.value) # 输出1
方法2:使用Python内置的copy模块
如果你的对象属性都是不可变类型,浅拷贝就足够了:
import copy class Object: def __init__(self): self.value = 0 a = Object() a.value = 1 b = copy.copy(a) # 浅拷贝创建副本 b.value = 2 print(a.value) # 输出1
如果对象有嵌套的可变属性(比如self.values = [1,2,3]),则需要使用copy.deepcopy()来完全复制所有层级的对象。
内容的提问来源于stack exchange,提问作者Peter Zung
相关产品推荐
相关产品推荐

