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

class variables is shared across all instances in python?

本问题已经有最佳答案,请猛点这里访问。

我一周前开始用python进行编码,我的错误是我很快就开始用oops、类和对象进行编码。我假设我的C++熟练程度会有帮助。我被下面的代码咬了一口

1
2
3
4
5
class A:
     var=0
     list=[]
     def __init__(self):
            pass

令我惊讶的是,var和list是一个全局变量,它似乎在所有实例中都是共享的。我想这在所有的情况下都是不同的…..我花了半天时间才弄明白…一个变量只能由一个类对象访问,但在所有实例中共享,这一点毫无意义。只是好奇,这背后有什么原因吗???????


只要您通过instance.varself.var访问,就不应该共享var。然而,对于该列表,您的语句所做的是在对类进行计算时,将创建一个列表实例并将其绑定到类dict,因此所有实例都将具有相同的列表。无论何时,只要你设置了instance.list = somethingelseresp。self.list = somethingelse应该得到一个实例级的值。

示例时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> 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中的静态变量:

1
2
3
4
5
// Example equivalent Java
class A {
    static int var = 0;
    static String[] list;
}

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

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

1
2
3
4
class A:
    def __init__(self):
        self.var = 0
        self.list = []

您可能需要查看Python中的静态类变量。


原因是在python中,class是一个可执行语句,与其他语句一样执行。类定义的主体在定义类时执行一次。如果您在其中有一行var = [],那么它只执行一次,因此该行只能创建一个列表。


注意,您没有看到var的这种行为,您只看到list的这种行为:

1
2
3
4
5
6
7
8
9
>>> class A:
...     var = 0
...     list = []
...
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0