30

一周前我开始使用 python 编码,这是我的错误,我很快就开始使用 oops、类和对象进行编码。我认为我的 C++ 熟练程度会有所帮助....我被以下代码所吸引

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

令我惊讶的是, var 和 list 有点像全局变量,它似乎在所有实例中共享......我认为它在所有实例中都不同......我花了半天时间才弄清楚那.... 一个变量只能由一个类对象访问,但在所有实例之间共享.. 只是好奇,这背后有什么原因吗? ??

4

4 回答 4

33

var只要您通过instance.var或访问它,绝对不应该共享它self.var。但是,对于列表,您的语句所做的是在评估类时,创建一个列表实例并将其绑定到类字典,因此所有实例都将具有相同的列表。每当你设置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']
于 2012-06-14T20:01:20.923 回答
17

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

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

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

对于普通的实例变量,在构造函数中声明它们:

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

您可能想查看Python 中的静态类变量

于 2012-06-14T19:59:32.073 回答
6

原因是在 Pythonclass中是一个可执行语句,可以像其他任何语句一样执行。类定义的主体在定义类时执行一次。如果你在那里有一行行var = [],那么它只会执行一次,因此只能创建一个列表作为该行的结果。

于 2012-06-14T20:03:54.317 回答
3

请注意,您看不到 的这种行为var,您只会看到它list

>>> class A:
...     var = 0
...     list = []
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0
于 2012-06-14T20:00:37.767 回答