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

Python类多实例间列表、字典属性跨实例联动异常咨询

问题成因

该现象是代码写法不符合Python类属性的语义规则导致的,不属于解释器bug,在所有Python3版本中表现一致。

你在类定义块内、方法外直接声明的txt_list、txt_dictionnary、txt_var都属于类属性,归属于类本身,默认被所有类实例共享。三个属性表现不一致,核心是可变/不可变类型的操作逻辑差异,以及属性查找规则的影响:

  • 列表、字典是可变类型:你在__init__中执行的self.txt_list.append(txt)、self.txt_dictionnary["hello"] = txt属于原地修改操作,没有给当前实例创建同名属性。Python访问实例属性时会优先查找实例自身的属性,找不到就回溯到类层面找共享属性,因此这两个操作实际修改的是类层面的共享对象,所有实例访问这两个属性时拿到的都是同一个被修改的对象,自然会出现跨实例同步变更的现象。
  • 字符串是不可变类型:你在__init__中执行的self.txt_var = txt属于赋值操作,会直接给当前实例绑定一个同名的实例属性。后续访问实例的txt_var时,会优先命中实例自身的属性,不会再读取类层面的共享值,因此每个实例的字符串属性都是独立的,不会互相影响。
修正写法

如果需要每个实例拥有独立的属性,所有实例专属的属性都应该在__init__构造方法中绑定到self上,不要在类层级定义可变类型的实例属性:

class Obj:
    def __init__(self, txt):
        self.txt_list = [txt]
        self.txt_dictionnary = {"hello": txt}
        self.txt_var = txt

修正后再运行原主程序逻辑,Obj1和Obj2的属性完全独立,修改Obj2的属性不会对Obj1产生任何影响,输出符合预期。你可以通过id()函数打印对象内存地址验证:原错误写法下两个实例的列表、字典内存地址完全相同,修正后地址各自独立。


内容的提问来源于stack exchange,提问作者William_D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:33:32