Python类中的列表在两个不同实例间共享同一对象?

11 投票
4 回答
10278 浏览
提问于 2025-04-15 22:17

我创建了一个类:

class A:
    aList = []

现在我有一个函数,它会实例化这个类并往 aList 里添加项目。

注意:这里有两个项目

for item in items:
    a = A();
    a.aList.append(item);

我发现第一个 A 对象和第二个 A 对象的 aList 里有相同数量的项目。

我本以为第一个 A 对象会在它的列表里有第一个项目,而第二个 A 对象会有第二个项目。

有人能解释一下这是怎么回事吗?

附注:

我通过把 aList 移到构造函数里解决了这个问题:

def __init__(self):
    self.aList = [];

但我仍然对这种行为感到好奇。

4 个回答

3

这个问题发生的原因是,列表是一种可变对象,也就是说它可以被改变。而这个列表在定义类的时候只创建一次,所以当你创建两个实例时,它们就共享了这个列表。例如:

class A:
    a = 0 #immutable
    b = [0] #mutable

a = A()
a.a = 1
a.b[0] = 1

b = A()
print b.a #print 0
print b.b[0] #print 1, affected by object "a"

所以,为了解决这个问题,我们可以像你提到的那样使用构造函数。当我们把列表放在构造函数里时,每次创建对象的时候,新的列表也会被创建。

4

你把类变量和对象变量搞混了。

如果你想要的是对象:

class A(object):
    def __init__(self):
        self.aList = []

在你的例子中,aList是一个类变量,你可以把它想象成其他语言中的'static'关键字。类变量是所有实例共享的。

13

你把这个列表定义成了类的属性。

类属性是所有这个类的实例共享的。也就是说,如果你在 __init__ 方法里把列表定义为 self.aList,那么这个列表就是你这个实例(self)自己的属性,这样一来,一切就会按照你预期的那样工作了。

撰写回答