我对Python(2.6.5)的这种行为感到困惑,有人可以解释为什么会发生这种情况吗?
class A():
mylist=[]
class B(A):
j=0
def addToList(self):
self.mylist.append(1)
b1 = B()
print len(b1.mylist) # prints 0 , as A.mylist is empty
b1.addToList()
print len(b1.mylist) # prints 1 , as we have added to A.mylist via addToList()
b2 = B()
print len(b2.mylist) # prints 1 !!! Why ?????
答案 0 :(得分:2)
你需要这样做:
class A:
def __init__(self):
self.mylist=[]
那样self.mylist
是一个实例变量。如果在方法之外定义它,它是一个类变量,因此在所有实例之间共享。
在B中,如果定义构造函数,则必须显式调用A的构造函数:
class B(A):
def __init__(self):
A.__init__(self)
Python tutorial中解释(不太清楚)。
答案 1 :(得分:2)
此代码在A(或子类)
的所有实例之间创建共享mylistclass A():
mylist=[]
您想要做的是:
class A():
def __init__(self):
self.mylist=[]
您可能会看到的是:
class A():
somevariable = a
def doit(self):
self.somevariable = 5
这是有效的,因为它创建了一个新的“somevariable”属性,因为你正在做一个赋值。在此之前,所有A实例共享somevariable的相同副本。只要你不改变副本就好了。当赋值变量时,它会被替换而不是被修改。所以当有问题的值是不可变的时(即你不能改变它们,你只能替换它们),这种技术才真正安全。但是,我认为这是一个非常糟糕的主意,你应该总是在 init中分配所有变量强>