类variables在Python中的所有实例共享?
我在一个星期前开始编写python代码,这是我的错误,我很快就开始使用oops,类和对象进行编码。 我认为我的C ++熟练程度将帮助….我通过下面的代码
class A: var=0 list=[] def __init__(self): pass
在这里,令我惊讶的是,var和list是一个全局variables,它在所有的实例中都是共享的……我认为它在所有实例中是不同的……我花了半天的时间那….它并没有丝毫的意义,一个variables只能被一个类对象访问,但是在所有的实例中共享…….只是好奇,是否有一个原因呢? ??
只要你通过instance.var
或self.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