2017-08-19 47 views
0

我遇到了一些相当奇怪的行为。Python 3.5奇怪地处理列表

class Example: 
    test = [] 

    def __init__(self): 
     print(self.test) 
     self.test.append(0) 


ex1 = Example() 
ex2 = Example() 
ex3 = Example() 

我期望这个输出每一次[]键,不过,我得到:

[] 
[0] 
[0, 0] 

这是什么魔法?你能帮我理解吗?
谢谢,你!

编辑: 嘿,谢谢你的快速解答。

只是为了澄清,如果“测试”是静态的,那么为什么我没有注意到这个问题,当我更换“self.test.append(0)”与“self.test = [0]”?

+0

'test'是一个* class *属性,而不是每个* instance *的属性。不要试图“宣布”这样的成员;你必须在'__init__'中创建它们。 –

+1

«为什么当我代替我没有注意到这种行为‘self.test.append(0)’与‘self.test = [0]’?»因为结合新对象实例属性'self.test',这将影响'Example.test'类属性。而'self.test.append(0)'只是改变现有的对象。 –

回答

2

test是一个静态类属性,你不断地用值来更新。 Python以这种方式与其他一些语言不同。要使其成为对象属性,请在构造函数中使用self.test = []

1

test有一个class-level static variable,这是类的实例之间共享。

你要在__init__方法中初始化test

class Example: 

    def __init__(self): 
     self.test = [] 
     print(self.test) 
     self.test.append(0)