Python不直观的成员变量行为

Tri*_*daz 2 python variables class

这个脚本:

class testa():
    a = []

class testb():
    def __init__(self):
        self.a = []

ta1 = testa(); ta1.a.append(1); ta2 = testa(); ta2.a.append(2)
tb1 = testb(); tb1.a.append(1); tb2 = testb(); tb2.a.append(2)

print ta1.a, ta2.a, tb1.a, tb2.a
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

[1, 2] [1, 2] [1] [2]
Run Code Online (Sandbox Code Playgroud)

但我期待

[1] [2] [1] [2]
Run Code Online (Sandbox Code Playgroud)

我为什么错了?testa和testb的定义似乎与我相同,那么为什么行为会如此彻底地改变?!

编辑:这似乎不直观,因为它不同于其他类型如int和str的行为.由于某种原因,列表在init中未初始化时被创建为类变量,但无论如何都将int和strs创建为对象变量.

Mar*_*ers 7

testa变量a是一个类变量,并且所有实例之间共享.ta1.ata2.a参考相同的清单.

testb变量中a是一个对象变量.每个实例都有自己的值.

有关更多详细信息,请参阅类和对象变量.