how*_*rks 24 python class global-variables instance-variables member
我在一周前开始使用python进行编码,这是我的错误,我很快就开始使用oops,类和对象进行编码.我认为我的C++熟练程度会有所帮助....我得到了以下代码
class A:
var=0
list=[]
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,var和list是有点全局变量,它似乎在所有实例中共享....我认为它在所有实例中都是不同的.....我花了半天才弄明白那....它没有任何意义,一个变量只能被一个类对象访问,但是在所有实例之间共享.......只是好奇,它背后有原因吗??? ??
men*_*nsi 28
var只要您通过instance.var或访问它,就绝对不应该共享self.var.但是,根据列表,您的语句所做的是在评估类时,创建一个列表实例并绑定到类dict,因此所有实例都将具有相同的列表.每当你设置instance.list = somethingelseresp.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']
Run Code Online (Sandbox Code Playgroud)
Rei*_*ica 15
这些基本上类似于Java中的静态变量:
// Example equivalent Java
class A {
static int var = 0;
static String[] list;
}
Run Code Online (Sandbox Code Playgroud)
这是预期的行为:类变量是针对类的.
对于普通实例变量,在构造函数中声明它们:
class A:
def __init__(self):
self.var = 0
self.list = []
Run Code Online (Sandbox Code Playgroud)
原因是在Python中class是一个可执行语句,其执行方式与其他语句一样。定义类后,该类定义的主体将执行一次。如果其中有一行var = [],则该行仅执行一次,因此该行只能创建一个列表。