Python类中的列表在两个不同实例间共享同一对象?
我创建了一个类:
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)自己的属性,这样一来,一切就会按照你预期的那样工作了。