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

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)

  • 是的,我只是想澄清你*是*共享不可变的`var`,你只是*也*在你做`self.var = ...`时用别的东西替换它.所以`var`和`list`的行为完全相同,只是`list`作为共享变量更有趣(因为它是可变的). (10认同)
  • 完全相同的事情发生在`var`和`list`,不同之处在于你不能像`list`一样附加到`var`,你只能声明另一个具有相同名称的变量. (5认同)

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中查看Static类变量.

  • @howtechstuffworks另一个变量也是静态的,但是如果您执行`self.var =“ something else”`,那么您将设置一个具有相同名称的实例变量(您将同时拥有`A.var`和`self .var`),并假设您是指实例变量。您仍然可以使用A.var访问类变量。您可以通过声明一个具有相同名称的实例方法(`self.list =“ something else”)来对list执行相同的操作。 (2认同)
  • @howtechstuffworks你通常应该为每个问题打开一个新线程,但要回答 - Python没有常量.有一些hacks来创建它们,但一般的解决方案是以大写字母命名常量并假设你的API用户不够愚蠢来改变它们(你会发现这是Python中的一个常见主题 - 你可以做什么,但只是因为你不能意味着你应该). (2认同)

Bre*_*arn 6

原因是在Python中class是一个可执行语句,其执行方式与其他语句一样。定义类后,该类定义的主体将执行一次。如果其中有一行var = [],则该行仅执行一次,因此该行只能创建一个列表。