You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:22:51