我对Python 2.7中的继承有疑问。
我有两个简单的类
class A():
l = []
def f(self):
del self.l[:]
if self.a == 'a':
self.l.append('1')
if self.a == 'b':
self.l.append('2')
class B(A):
def __init__(self, a):
self.a = a
我在循环中创建了两个B实例,并为集合列表'l'
调用f()foo = ['a','b']
l = []
for x in foo:
z = B(x)
z.f()
# normal result
print z.l
l.append(z)
print '-----'
for x in l:
# strange result
print x.l
结果我得到了奇怪的输出:
Output:
['1']
['2']
-----
['2']
['2']
[Finished in 0.0s]
而不是1,2; 1,2
为什么会这样?
我可以通过在def f(self)
中定义列表“l”来修复它class A():
def f(self):
l = []
if self.a == 'a':
self.l.append('1')
if self.a == 'b':
self.l.append('2')
在这种情况下,我得到正常的输出,但仍然不明白为什么会发生这种情况。
由于
答案 0 :(得分:0)
在第一种情况下,l
是一个类变量,该变量由该类的实例共享。
在第二种情况下,l
是一个实例变量,因此每个对象都有自己的变量。
请注意,这与继承无关 - 如果实例化A类或B类,您将看到相同的行为。
答案 1 :(得分:0)
问题是l
不是实例变量,每个A
(或B
)实例都有自己的副本,它是类变量,由所有副本共享。
如果您不想要类变量,请不要定义一个。与您在self.a
中创建B.__init__
的方式相同,请在self.l
中创建A.__init__
。