- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 C++ 背景,经常使用静态变量来减少必须初始化变量的时间数量(特别是在初始化需要很长时间的情况下)。因此,从 StackOverflow 上的其他帖子中,人们建议使用静态类变量,如下所示:
class MyClass(object):
StaticList1 = [...] # Very large list
StaticList2 = [...] # Very large list
现在,如果在程序执行过程中至少存在 1 个 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
由于具有相同的名称,因此通常不鼓励这样做,因为正是这种困惑。
作为单独的注释,您可以考虑注释 data
方法为@staticmethod
(并删除移动中的 self
参数)并将其称为 MyClass.data()
为了更清楚地表明您将在每次调用时返回相同的列表实例。
关于Python - 静态类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43186844/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!