类变量在python中的所有实例之间共享?

时间:2012-06-14 19:56:42

标签: python class global-variables instance-variables member

我在一周前开始使用python进行编码,这是我的错误,我很快开始使用oops,类和对象进行编码。我认为我的C ++熟练程度会有所帮助....我得到了以下代码

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

令我惊讶的是,var和list是有点全局变量,它似乎在所有实例中共享....我认为它在所有实例中都是不同的.....我花了半天时间弄清楚....它没有任何意义,变量只能由类对象访问,但是在所有实例之间共享.......只是好奇,它背后的原因是什么? ?????

4 个答案:

答案 0 :(得分:27)

只要您通过varinstance.var访问,就绝对不能共享

self.var。但是,根据列表,您的语句所做的是在评估类时,创建一个列表实例并绑定到类dict,因此所有实例都将具有相同的列表。每当你设置instance.list = somethingelse时。 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']

答案 1 :(得分:14)

这些基本上类似于Java中的静态变量:

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

这是预期的行为:类变量用于类

对于普通实例变量,请在构造函数中声明它们:

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

您可能需要查看Static class variables in Python

答案 2 :(得分:4)

原因是在Python class中是一个可执行语句,其执行方式与其他任何语句一样。定义类时,类定义的主体执行一次。如果你在那里有一个直线var = [],那么它只执行一次,因此只能创建一个列表作为该行的结果。

答案 3 :(得分:2)

请注意,var没有看到此行为,您只能看到list

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