Python 编译器生成的代码对象包含指令中使用的常量元组(名为co_consts
)以及一个包含名称的元组(名为co_names
).
为什么有两个不同的列表?仅使用不会更简单co_consts
也为了名字?
考虑以下函数。
def f(x):
x += n
return x * 4
Here x
是本地名称,其值可以更改。4
是一个常数。它的价值永远不会改变。但是,它仍然是一个对象,最好缓存它们,而不是每次需要时创建一个新对象。最后,n
是一个全局参考。字符串"n"
由函数存储,以便可以用作检索的密钥n
来自函数的全局上下文。
>>> f.__code__.co_nlocals # just 1 (for x)
1
>>> f.__code__.co_consts
(None, 4)
>>> f.__code__.co_names
('n',)
>>> "n" in f.__globals__ and globals() is f.__globals__
True
将名称和常量分开的原因是为了内省。合并元组的唯一真正原因是内存效率,尽管这只会为每个函数获得一个对象和一个指针。考虑以下函数。
def g():
return "s" * n
如果包含常量的元组与包含名称的元组合并,那么您(而不是虚拟机)将无法分辨哪些值用于访问全局变量以及哪些是函数的常量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)