Python 2.7中类继承的奇怪行为

时间:2014-09-11 04:22:21

标签: python inheritance

我对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')

在这种情况下,我得到正常的输出,但仍然不明白为什么会发生这种情况。

由于

2 个答案:

答案 0 :(得分:0)

在第一种情况下,l是一个类变量,该变量由该类的实例共享。

在第二种情况下,l是一个实例变量,因此每个对象都有自己的变量。

请注意,这与继承无关 - 如果实例化A类或B类,您将看到相同的行为。

答案 1 :(得分:0)

问题是l不是实例变量,每个A(或B)实例都有自己的副本,它是变量,由所有副本共享。

如果您不想要类变量,请不要定义一个。与您在self.a中创建B.__init__的方式相同,请在self.l中创建A.__init__