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

时间:2010-05-03 09:25:45

标签: python

我创建了一个类:

class A:
    aList = []

现在我有了实例化这个类并将项添加到aList中的函数。

注意:有2个项目

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

我发现第一个A和第二个A对象的aList中的项目数相同。 我希望第一个A对象的列表中有第一个项目,第二个A对象的aList中有第二个项目。

任何人都可以解释这是怎么发生的吗?

PS:

我设法通过在构造函数中移动aList来解决这个问题:

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

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

4 个答案:

答案 0 :(得分:11)

您已将列表定义为类属性。

类属性由类的所有实例共享。 当您将__init__中的列表定义为self.aList时,列表是您的实例的属性(自我),然后一切都按预期工作。

答案 1 :(得分:3)

你混淆了类和对象变量。

如果你想要对象:

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

在您的示例中,aList是一个类变量,您可以将其与其他语言中的“static”关键字进行比较。当然,类变量在所有实例上共享。

答案 2 :(得分:1)

这是因为list是一个可变对象,并且只在定义类时才创建一次,这就是在创建两个实例时它被共享的原因。例如,

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"

因此,为了解决这个问题,我们可以像你提到的那样使用构造函数。当我们将列表放在构造函数中时,无论何时实例化对象,都将创建新列表。

答案 3 :(得分:0)

在Python中,在类定义内声明而不是在方法内部的变量是 class static 变量。您可能有兴趣看一下this answer to another question