我开始在Python编码一个星期前,这是我的错误,我开始不久使用哎呀,类和对象的编码。 我以为我的C ++水平将帮助....我用下面的代码位
class A:
var=0
list=[]
def __init__(self):
pass
这让我吃惊,VAR和列表都还挺全局变量,它是跨似乎所有实例....我的想法是这是在所有的情况下,不同的共享.....我花了半天找出这....这是没有丝毫甚至某种意义上说,一个变量只能由一个类的对象访问,但是在所有的情况下.......只是好奇是共享的,是有其背后原因??? ??
var
应该肯定不会,只要你通过访问共享instance.var
或self.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']
这些基本上是像Java中的静态变量:
// Example equivalent Java
class A {
static int var = 0;
static String[] list;
}
这是预期的行为:类变量的类 。
对于正常的实例变量,声明他们在构造函数:
class A:
def __init__(self):
self.var = 0
self.list = []
你可能想看看在Python静态类变量 。
其原因是,在Python class
是像任何其他执行的可执行语句。 类定义的主体被执行一次,被定义的类时。 如果你有一个一行行var = []
在那里,然后只执行一次,因此只有一个列表都不能作为该行的结果来创建。
请注意,您没有看到这个行为var
,你只看到它的list
:
>>> class A:
... var = 0
... list = []
...
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0