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

Python OOP中列表作为类属性修改实例时同步变更问题咨询

问题原因与解决方案

核心差异:可变与不可变类型的类属性操作逻辑不同

你定义的两个类属性分属不同类型,操作时的底层逻辑有本质区别:

  • number_of_stone 是整数,属于不可变类型:执行self.number_of_stone +=1时,本质是先读取类属性的初始值0,计算得到新值1后,给当前实例新建一个同名的实例属性,不会修改原类属性,也不会影响其他实例,所以两个实例的number_of_stone都是独立的1,符合你的预期。
  • stone_collection 是列表,属于可变类型:执行self.stone_collection.append(self.name)时没有重新赋值操作,是直接对类属性指向的同一个列表对象做修改,所有实例共享这个列表对象,所以不管哪个实例添加元素,所有实例访问到的列表内容都会同步更新,才会出现两个实例的stone_collection都为["One", "Two"]的结果。

修复方案

如果需要每个实例拥有独立的stone_collection,不要将列表定义为类属性,放到__init__方法中作为实例属性初始化即可:

class Backet:
   number_of_stone = 0
   
   def __init__(self,name):
      self.name = name
      self.number_of_stone +=1
      # 每个实例初始化时生成独立的列表
      self.stone_collection = []
      self.stone_collection.append(self.name)

stone_one = Backet('One')
stone_two = Backet('Two')

修改后运行结果:

  • stone_one.stone_collection 输出为 ['One']
  • stone_two.stone_collection 输出为 ['Two']
    符合预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:27:01