我创建了一个类:
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 = [];
但我仍然对这种行为感到好奇
答案 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。