类变量跨所有的Python实例共享? [重复] 类变量跨所有的Python实例共享? [重复]

2019-06-01 02:35发布

这个问题已经在这里有一个答案:

  • 如何避免实例共享类数据? 8个回答

我开始在Python编码一个星期前,这是我的错误,我开始不久使用哎呀,类和对象的编码。 我以为我的C ++水平将帮助....我用下面的代码位

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

这让我吃惊,VAR和列表都还挺全局变量,它是跨似乎所有实例....我的想法是这是在所有的情况下,不同的共享.....我花了半天找出这....这是没有丝毫甚至某种意义上说,一个变量只能由一个类的对象访问,但是在所有的情况下.......只是好奇是共享的,是有其背后原因??? ??

Answer 1:

var应该肯定不会,只要你通过访问共享instance.varself.var 。 但是,随着名单,你的说法是不上课的时候被评估,创建一个列表实例,并绑定到类字典,因此所有实例都具有相同的列表。 只要设置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']


Answer 2:

这些基本上是像Java中的静态变量:

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

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

对于正常的实例变量,声明他们在构造函数:

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

你可能想看看在Python静态类变量 。



Answer 3:

其原因是,在Python class是像任何其他执行的可执行语句。 类定义的主体被执行一次,被定义的类时。 如果你有一个一行行var = []在那里,然后只执行一次,因此只有一个列表都不能作为该行的结果来创建。



Answer 4:

请注意,您没有看到这个行为var ,你只看到它的list

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


文章来源: class variables is shared across all instances in python? [duplicate]