Python-静态类变量 我来自C++背景,经常使用静态VARS来减少时间变量的数量(特别是初始化时间过长)。因此,在其他关于StackOverflow的帖子中,人们建议使用静态类变量,如下所示: class MyClass(object): StaticList1 = [...] # Very large list StaticList2 = [...] # Very large list

Python-静态类变量 我来自C++背景,经常使用静态VARS来减少时间变量的数量(特别是初始化时间过长)。因此,在其他关于StackOverflow的帖子中,人们建议使用静态类变量,如下所示: class MyClass(object): StaticList1 = [...] # Very large list StaticList2 = [...] # Very large list,python,class,static,Python,Class,Static,现在,如果在整个程序执行过程中至少存在一个MyClass实例,并且列表只创建一次,那么这就可以了。但是,如果在执行的某个阶段没有MyClass的实例,Python似乎会删除静态列表(我假设是因为引用计数器降为0) 所以我的问题是,有没有简单的方法不使用外部模块只初始化一次StaticList1和StaticList2(第一次使用它们),并且在程序存在之前(或者手动删除列表),即使没有MyClass的实例,也永远不删除它们 编辑: 也许我把这个问题简单化了。我在做什么: class MyClass

现在,如果在整个程序执行过程中至少存在一个MyClass实例,并且列表只创建一次,那么这就可以了。但是,如果在执行的某个阶段没有MyClass的实例,Python似乎会删除静态列表(我假设是因为引用计数器降为0)

所以我的问题是,有没有简单的方法不使用外部模块只初始化一次StaticList1和StaticList2(第一次使用它们),并且在程序存在之前(或者手动删除列表),即使没有MyClass的实例,也永远不删除它们

编辑:

也许我把这个问题简单化了。我在做什么:

class MyClass(object):

    StaticList = None

    def __init__(self, info):
        if self.StaticList == None:
            print "Initializing ..."
            self.StaticList = []
            # Computationally expensive task to add elements to self.StaticList, depending on the value of parameter info

    def data(self):
        return self.StaticList
我从另一个脚本导入模块,并有如下循环:

import myclass
for i in range(10000):
    m = myclass.MyClass(i)
    d = m.data()
    # Do something with d.

静态列表的初始化大约需要200-300毫秒,并且在循环的每次迭代中都会执行,因此循环需要非常长的时间才能完成。

而您的类确实有一个名为
StaticList
的静态字段,由于使用的是
self
限定符,您实际上正在初始化并使用同名的实例字段。如果您使用
MyClass.StaticList
来初始化并访问它,我认为您的代码会工作得很好

通常,通过Python的名称查找,您可以通过实例访问类字段,就像它是该实例上的实例字段一样(例如,
self.StaticList
),只要您没有在该实例上实际设置同名的实例字段。从那一刻起,实例字段将隐藏类字段(即,
self.StaticList
将找到您的新值,而
MyClass.StaticList
仍将引用您的类值)

作为一个刚从口译员那里得到的例子:

>>> class A(object):
...  v=2      # static initialization
...
>>> A.v
2
>>> a=A()     # get an instance, and
>>> a.v       # get the static value via the instance:
2
>>> a.v = 7   # but now set 'v' on the instance, and ...
>>> a.v       # we will get the instance field's value:
7
>>> A.v       # the static value is still the old:
2
>>> b=A()     # and other instances of the class ...
>>> b.v       # will use the same old static value:
2
实例变量
a.v
最初等于
a.v
,但通过显式设置
a.v=7
,您将在该实例中“分离”它们

虽然这意味着,原则上,您可以使用静态类字段
MyClass.Values
以及同名的实例字段
xyz.Values
,但对于这种混淆,通常不鼓励这样做


作为单独的注释,可以考虑将<代码>数据< /代码>方法作为<代码> @静态方法< /代码>(并在移动中删除<代码>自身<代码> >参数,并将其称为<代码> MyClass .DATA()。更清楚地表明,每次调用都会返回相同的列表实例。

您可以利用模块是单例的事实,因此,如果您创建这些模块级成员,只要导入模块,它们就会一直存在,并且只存在一次。这听起来不对,我不希望这些名单有任何结果。您是说您正在调用
MyClass.StaticList1…
并且您得到了一个错误?您得到了什么错误?*但是,如果在执行的某个阶段没有MyClass的实例,Python似乎会删除静态列表*AFAIK,这是错误的。该类将独立于该类的对象而存在,并且在类级别定义的所有属性将通过该类继续存在。你能举个例子说明你的问题吗?如果每次调用构造函数/\uuuu init\uuuuuu,静态变量都会被清除并重新计算。然后我不明白为什么它在C++中是静态的,也不是Python,它只是在循环的每一次迭代中需要完成的工作。可能大部分工作都发生在
#计算代价高昂的任务…
这一行,而您如何做到这一点却没有显示出来。如果不是因为这个原因,这听起来是合乎逻辑的:我一直在为其他一些类使用self.StaticVar,其中静态var直接在声明中初始化,而不是在构造函数中初始化。如果我在类中的某个地方打印self.StaticVar,就会打印var的值。因此,在这种情况下,MyClass.StaticVar似乎与self.StaticVar相同。我扩展了答案的逻辑,以解决这一问题。:)