- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Python 编译器生成的代码对象包含指令中使用的常量元组(名为 co_consts
)以及包含名称的元组(名为 co_names
)。
为什么有两个不同的列表?使用 co_consts
不会更简单也是为了名字?
câu trả lời hay nhất
考虑以下函数。
def f(x):
x += n
return x * 4
这里的x
是一个局部名称,它的值可以改变。 4
是一个常量。它的值(value)永远不会改变。但是,它仍然是一个对象,最好将它们缓存起来,而不是每次需要时都创建一个新对象。最后,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__
ĐÚNG VẬY
将名称和常量分开的原因是为了内省(introspection)。合并元组的唯一真正原因是内存效率,尽管这只会为每个函数获得一个对象和一个指针。考虑以下函数。
def g():
return "s" * n
如果包含常量的元组与包含名称的元组合并,那么您(不是虚拟机)将无法分辨哪些值用于访问全局变量,哪些是函数的常量。
关于python - 为什么 python VM 有 co_names 而不是仅仅使用 co_consts?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187661/
description检查模块中的 co_names 读取: tuple of names of local variables 但在实践中,co_names 似乎是一个全局变量名称的元组,而 co_
Python 编译器生成的代码对象包含指令中使用的常量元组(名为 co_consts )以及包含名称的元组(名为 co_names )。 为什么有两个不同的列表?使用 co_consts 不会更简单也
Tôi là một lập trình viên xuất sắc, rất giỏi!