CPython 中变量赋值是如何实现的?

2023-12-03

我知道 Python 中的变量实际上只是某些底层对象的引用/指针。由于它们是指针,我猜它们以某种方式“存储”或以其他方式与它们引用的对象的地址相关联。

这样的“地址存储”可能发生在 CPython 实现的低层。但 我对 C 的了解还不足以从源代码中推断出这一点,我也不知道从源代码中的哪里开始查找。

所以,我的问题是:

在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者如何与指向它们的变量关联?


在模块作用域或类作用域中,变量被实现为 Python 字典中的条目。指向对象的指针存储在字典中。在旧的 CPython 版本中,指针直接存储在 dict 的底层哈希表中,但从 CPython 3.6 开始,哈希表现在将索引存储到 dict 条目的密集数组中,并且指针位于该数组中。 (还有一些工作方式稍有不同的分键字典。它们用于优化对象属性,您可能会或可能不会将其视为变量。)

在函数作用域中,Python 创建一个堆栈帧对象来存储给定函数执行的数据,并且堆栈帧对象包含指向变量值的指针数组。变量被实现为该数组中的条目,并且指向值的指针存储在数组中,位于每个变量的固定索引处。 (字节码编译器负责确定这些索引。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPython 中变量赋值是如何实现的? 的相关文章

随机推荐

  • “Cont r a”能否对其延续的结果进行后处理

    the Cont r atype 代表一个需要延续的函数a gt r并产生类型的结果r 所以无论是延续还是整个Cont r a产生相同的结果type r 我的问题是 两个结果一定相同吗value 或者可以Cont r a对延续的结果进行后处
  • MongoDB DateTime 对象和 YYYY-MM-DD 字符串之间的区别

    在 MongoDB 中 我只需要进行日期范围查询 但数据集很大 9 M 将字符串转换为 DateTime 对象 我使用 Perl 脚本 然后将它们插入到 MongoDB 中非常耗时 如果我只是将日期存储为字符串 YYYY MM DD 范围查
  • css / html - 删除 li 标签之前的空格

    我想删除 li 标签之前的空格 标记为黄色 但我不知道如何操作 我阅读了有关此问题的其他问题 但这对我没有帮助 我尝试添加 margin 0px 这是描述问题的屏幕截图
  • Elasticsearch 2.1:结果窗口太大(index.max_result_window)

    我们从 Elasticsearch 2 1 检索信息并允许用户翻阅结果 当用户请求高页码时 我们会收到以下错误消息 结果窗口太大 from size 必须小于或等于 到 10000 但是 10020 请参阅滚动 api 以提高效率 请求大数
  • 设置边框大小

    我想让 borderpane 的边框更圆更粗 我测试了这段代码 bpi setStyle fx background color linear gradient to bottom f2f2f2 d4d4d4 fx border 12px
  • 无法在将 DataView 实例作为项目源的 WPF 数据网格中显示数据

    我正在使用 WPF 工具包中的 DataGrid 对象 我将 DataGrid 对象绑定到 DataTable 实例的默认视图 如以下代码中声明的 WeatherGrid ItemsSource weatherDataTable Defau
  • 如何使用TFS API创建新的源代码分支?

    我正在尝试使用 API 创建一个新分支 并且已经使用了两者PendBranch and CreateBranch 问题在于CreateBranch 它是否立即提交 我希望能够在分支签入时添加注释 所以 我所做的如下所示 基本上 我从 Win
  • 从 Django 中的一系列 id 中检索匹配对象的列表

    我想实现一些相对简单的事情 我想从给定一系列 id 的模型中检索所有对象 例如 从一本书的章节中检索第 5 行到第 10 行 现在在我的views py中 我 def line range request book id chapter i
  • Mac OS X Yosemite 10.10 上的 Mcrypt 与 Mamp Pro

    昨天 Yosemite 更新后 Mcrypt 扩展出现了问题 基于PHP的Laravel 框架的 artisan CLI返回 需要 Mcrypt PHP 扩展 PATH 变量似乎是正确的 哪里配置错了 更新之前一切正常 配置 which p
  • jquery ui 日期选择器限制为星期日

    我已经查看了此类问题的一些答案 但无法让它们按照我需要的方式工作 我需要让我的 jQuery UI 日期选择器只允许选择过去的星期日 这可以吗 谢谢 Enable Sunday only datepickerID datepicker da
  • Ajax 更新后重新绑定 jQuery 事件 (updatepanel)

    我的页面上有几个输入和选项元素 每个元素 几乎 都附加了一个事件 用于在页面上的某些文本发生更改时更新它们 我使用 jQuery 这真的很酷 我也用微软的Ajax框架 利用 UpdatePanel 我这样做的原因是 某些元素是根据某些服务器
  • 如何旋转缓冲图像而不裁剪它?有没有办法旋转 JLayeredPane 或 JLabel?

    我已经搜索过 但没有得到直接的答案 我想要旋转但不裁剪缓冲图像 我知道新的维度会是这样的 int w originalImage getWidth int h originalImage getHeight double toRad Mat
  • 单击 tr 的 td 元素后如何获取 tr 的 id?

    我有一个 tr 专栏 像这样 那么在单击具有 id quick update order product 的更新后如何使用 jquery 获取 tr 的 id tr td span class product price show span
  • 将对象添加到 NSMutableDictionary 时出现问题

    我正在制作一个 iPhone 应用程序 并且正在从服务器加载信息 我将 NSURLRequest 发送到服务器并返回 NSString 值 这工作正常 我得到的值是正确的 问题是 当我尝试将变量的值添加到我用来存储值的 NSMutableD
  • 跨域 PHP 会话

    我正在构建一个网站 允许用户在我的网站上指向 CNAME 记录来运行他们的 配置文件 这允许您自己的域名在我的网站上加载您的配置文件 这引发了与会议相关的各种问题 我见过 virb 这样做过 我没有在 iFrame 中看到任何基于会话的信息
  • OnBackPressed(软键盘打开)

    我想在软键盘打开时完成活动 我想覆盖软键盘的后退事件并完成活动 我正在使用这个 但它不起作用 有什么想法吗 public boolean onKeyPreIme int keyCode KeyEvent event if keyCode K
  • 如何通过 myplayer 将视频嵌入到 QWidget 框架中?

    是否有可能在PyQt4通过嵌入视频mpylayer into a QWidget 或进入它的子类 如果是这样 您能否提供一个最小的工作示例 有关嵌入 MPlayer 的 Qt Widget 的完整示例 请尝试qmp小部件 但这里有一个最小的
  • BlackBerry 设备存储上的 SqLite 数据库

    我正在尝试在 BlackBerry 模拟器的设备存储中创建数据库 在9500模拟器中 数据库创建成功 但创建表时出现 文件系统错误 消息 在 9700 模拟器上 数据库在创建步骤失败 是否有一个代码序列可以为所有模拟器创建数据库 我编写了以
  • 从 pandas 数据框数据透视表创建绘图

    我是Python新手 想知道如何在我使用数据透视表函数创建的数据上创建条形图 Create a pivot table for handicaps count calculation for no show people based on
  • CPython 中变量赋值是如何实现的?

    我知道 Python 中的变量实际上只是某些底层对象的引用 指针 由于它们是指针 我猜它们以某种方式 存储 或以其他方式与它们引用的对象的地址相关联 这样的 地址存储 可能发生在 CPython 实现的低层 但 我对 C 的了解还不足以从源