为什么 python VM 有 co_names 而不是仅仅使用 co_consts?

2023-12-20

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(使用前将#替换为@)

为什么 python VM 有 co_names 而不是仅仅使用 co_consts? 的相关文章

随机推荐

  • 使用 Visual Studio 管理源代码管理中的引用

    我在 Visual Studio 项目中管理 dll 引用时遇到问题 所有注册的 NET 和 COM 引用都工作正常 但当涉及磁盘上的 dll 文件时 如果我引用磁盘上的文件 我的同事将丢失引用 因为他们可能将其放在磁盘上的不同位置等 Vi
  • 如何使用layoutIfNeeded?

    何时以及如何layoutIfNeeded用过的 我知道当我们改变视图的布局时 我们可以调用setNeedsLayout更新布局但不确定何时layoutIfNeeded应该使用 注意 我有layoutIfNeeded在实际代码中使用但忘记了它
  • 无法在iOS中将统一的CNContact添加到CNGroup中

    这就是我正在做的 void doCreateGroup self contentView endEditing true NSString newString self contentView groupNameField text str
  • 检索 SQLite 中所有项目的最快方法是什么?

    我在 Windows 上编程 我将信息存储在 sqlite 中 然而我发现获取所有物品有点慢 我正在使用以下方式 select from XXX 检索 1 7MB SQLite DB 中的所有项目大约需要 200 400 毫秒 太慢了 有人
  • 在 NodeJS 中可靠地读取 FIFO

    我正在编写一个与第三方应用程序交互的 NodeJS 脚本 第三方应用程序将在文件打开期间将数据写入文件 我希望我的 NodeJS 应用程序能够实时接收这些数据 我的脚本创建一个 fifo child process spawnSync mk
  • 在 C++ 中从 WMI(Win32_LogicalDisk 类)调用 Chkdsk ->“参数无效”

    我正在尝试从 C 中的 WMI 运行 Chkdsk 我正在使用 Qt Framework ExecMethod 返回 参数无效 我已经根据设置参数http msdn microsoft com en us library cc250766
  • 如何获取隐藏父元素的大小?

    1 4 4 返回隐藏元素的大小 但是另一个隐藏元素中的元素呢 除了 getWidth 还有更好的解决方案吗
  • SqlAlchemy:如何实现 DROP TABLE ... CASCADE?

    我需要删除 PostgreSQL 数据库中具有外键约束并且需要的表DROP TABLE CASCADE 我可以执行原始 SQL engine execute DROP TABLE s CASCADE table name 但是 我想实现这种
  • 尝试在 r 中运行 glmer 时出现警告消息

    目前 我正在尝试在最新版本的 R 和 lme4 上重新运行旧的数据分析 二项式 glmer 模型 从 2013 年初开始 因为我不再有旧版本的 R 和 lme4 但是 我遇到了与 dmartin 和 carine 之前的线程 第一条警告消息
  • Bundle.main.path(forResource... 查找 xml 文件时总是返回 nil

    我正在尝试从我的包中读取文件 我知道以前有人问过这个问题 但我已经阅读了其他解决方案 但其中似乎不符合我的情况 我有一个 XML 文件 我可以在项目导航器中看到它 我还可以通过转到项目 构建阶段 复制捆绑资源来检查它是否包含在捆绑包中 我尝
  • 从 Azure ACS 下载登录页面后,如何使返回 URL 再次正常工作?

    Azure 培训工具包包括一个名为 IntroToACS2 的实验室 在其中创建一个 WebRole 并启用 ACS 以便您可以使用 Google Live 或 Yahoo ID 登录 本实验的第二部分将引导您完成从 ACS 下载示例登录页
  • gcc/ld:动态链接中的 -Wl、-rpath 是什么?静态链接中的 -l 是什么?

    对于 my dir path foo a 和 my dir path bar a 要使用 gcc g 静态链接 可以使用 L指定包含静态库的目录和 l指定库的名称 在这种情况下 人们会写gcc L my dir path lfoo lbar
  • 将新对等点添加到超级账本结构组织中需要采取哪些步骤?

    我正在学习使用 Hyperlegder Fabric 构建网络 因为我已经使用 Hyperledger Composer 开发了一个网络 下一步是构建生产网络 我已经开始构建第一个网络示例并开始工作 我已经添加了 Org3 和 2 个对等点
  • Windows:从区域设置字符串获取 LCID?

    我有代表语言环境的字符串数据 例如 fr 或 en 我需要将其转换为适当的 LCID 值 例如0x80c or 0x409 有没有函数或宏可以做到这一点 我在 Windows 7 上使用 C 这些是 LCID 值 不确定 LID 是什么意思
  • 如何声明循环变量的类型

    我想做一些整数算术 并且正在检查如果我提供有关 SBCL 的明确信息 SBCL 是否可以获得更快的速度type我使用的价值观 虽然我可以轻松使用declare in a defun or let直接这样做 我不明白将该语句放在何处loop构
  • Play框架-在mySql中上传文件

    在 play 2 0 中上传 mySql db 文件的最简单方法是什么 上传数据库或上传文件夹中的文件 然后在数据库中保存链接 我会去将参考保存在数据库中并将图像上传到网络服务器上的某个位置 或者 如果您坚持将图像保存在数据库中 请将其另存
  • SQL Server 2005 计算列被持久化

    我的表中有一些计算列 需要知道是否应该将 Is Persisted 设置为 true 有什么优点 有什么缺点吗 持续 是什么意思 在此上下文中 持久 是指 物理存储 这意味着计算值在插入 和更新 时计算一次并存储在磁盘上 因此不必在每次选择
  • 光滑的旋转木马。想要自动播放幻灯片一次并停止

    我正在将 Slick 插入网站 我有主页除了我无法弄清楚的一件事之外 正在使用流畅的幻灯片放映 我有 2 张幻灯片 他们从图像的幻影版本发展而来一张一张地淡入图像的全分辨率细节 那时我希望最后一个图像停止并停留在那里 滑块的标记是 div
  • 使用 TextFormatted 删除未在 EditText 中呈现的 html 标签

    我正在尝试在 EditText 控件中呈现 html 字符串 粗体 斜体和下划线 html 可以正确呈现 但删除线会被忽略 这是 EditText 控件 没什么花哨的
  • 为什么 python VM 有 co_names 而不是仅仅使用 co_consts?

    Python 编译器生成的代码对象包含指令中使用的常量元组 名为co consts 以及一个包含名称的元组 名为co names 为什么有两个不同的列表 仅使用不会更简单co consts也为了名字 考虑以下函数 def f x x n r