类variables在Python中的所有实例共享?

我在一个星期前开始编写python代码,这是我的错误,我很快就开始使用oops,类和对象进行编码。 我认为我的C ++熟练程度将帮助….我通过下面的代码

class A: var=0 list=[] def __init__(self): pass 

在这里,令我惊讶的是,var和list是一个全局variables,它在所有的实例中都是共享的……我认为它在所有实例中是不同的……我花了半天的时间那….它并没有丝毫的意义,一个variables只能被一个类对象访问,但是在所有的实例中共享…….只是好奇,是否有一个原因呢? ??

只要你通过instance.varself.var访问它,绝对不应该共享var 。 然而,对于这个列表,当你的语句被评估的时候,你的语句会产生一个列表实例,并绑定到类dict,因此所有的实例都有相同的列表。 每当你设置instance.list = somethingelse resp。 self.list = somethingelse ,它应该得到一个实例级别的值。

示例时间:

 >>> class A(): ... var = 0 ... list = [] ... >>> a = A() >>> b = A() >>> a.var 0 >>> a.list [] >>> b.var 0 >>> b.list [] >>> a.var = 1 >>> b.var 0 >>> a.list.append('hello') >>> b.list ['hello'] >>> b.list = ['newlist'] >>> a.list ['hello'] >>> b.list ['newlist'] 

这些基本上像Java中的静态variables:

 // Example equivalent Java class A { static int var = 0; static String[] list; } 

这是预期的行为:类variables是为类

对于普通的实例variables,在构造函数中声明它们:

 class A: def __init__(self): self.var = 0 self.list = [] 

你可能想看看Python中的静态类variables 。

原因是在Python class是一个可执行的语句,像任何其他执行。 类定义的主体在定义类时执行一次。 如果你有一行行var = [] ,那么它只执行一次,所以只有一个列表可以被创build作为该行的结果。

请注意,您不会看到var这种行为,您只能看到它的list

 >>> class A: ... var = 0 ... list = [] ... >>> a1 = A() >>> a2 = A() >>> a1.var = 3 >>> a2.var 0