我在一周前开始使用python进行编码,这是我的错误,我很快开始使用oops,类和对象进行编码。我认为我的C ++熟练程度会有所帮助....我得到了以下代码
class A:
var=0
list=[]
def __init__(self):
pass
令我惊讶的是,var和list是有点全局变量,它似乎在所有实例中共享....我认为它在所有实例中都是不同的.....我花了半天时间弄清楚....它没有任何意义,变量只能由类对象访问,但是在所有实例之间共享.......只是好奇,它背后的原因是什么? ?????
答案 0 :(得分:27)
var
或instance.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