如何在Python中创建独立内存的新对象列表?属性共享异常排查
问题原因与解决方案
你遇到的问题核心是类属性被所有实例共享。你的代码里,_name和_words是定义在类example下的类属性,而非每个实例独有的实例属性。这意味着所有example实例共用同一个_words列表,不管哪个实例调用add_words方法,修改的都是同一份数据,导致所有实例的_words同步变化。
另外,__init__方法里的_name = name也存在错误——这只是创建了一个局部变量,并没有给实例的_name属性赋值,必须用self._name才能绑定到当前实例。
修正后的代码
将实例属性的定义移到__init__方法内,用self.前缀声明,确保每个实例拥有独立的属性空间:
class example: def __init__(self, name): self._name = name # 实例属性:每个实例独立持有 self._words = [] # 实例属性:每个实例初始化独立空列表 def add_words(self, new_words): for i in new_words: self._words.append(i) examples = [example("example_1"), example("example_2"), example("example_3")] examples[0].add_words(["test1", "test2"]) print(examples[2]._words) # 输出:[]
关键说明
- 类属性:定义在类内部、方法外部的变量,属于整个类,所有实例共享同一份数据。比如你原代码中的
_name = ""和_words = [],所有example实例会共用这个列表。 - 实例属性:定义在
__init__(或其他实例方法)内、以self.开头的变量,属于单个实例,每个实例都有独立的内存空间,修改自己的属性不会影响其他实例。
修正后,每个example实例都会初始化自己的_words空列表,调用add_words只会修改当前实例的列表,其他实例的_words保持初始的空列表状态。
内容的提问来源于stack exchange,提问作者Rufus
相关产品推荐
相关产品推荐

