【问题标题】:How is variable assignment implemented in CPython?CPython中变量赋值是如何实现的?
【发布时间】:2020-08-14 09:14:57
【问题描述】:
我知道 Python 中的变量实际上只是一些底层对象的引用/指针。而且由于它们是指针,我猜它们以某种方式“存储”或以其他方式与它们所引用的对象的地址相关联。
这种“地址存储”可能发生在 CPython 实现的低层。但
我对 C 的了解不足以从源代码中推断出这一点,我也不知道从源代码的哪个位置开始查找。
所以,我的问题是:
在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者以其他方式与它们相关联?
【问题讨论】:
标签:
python
c
python-3.x
cpython
python-internals
【解决方案1】:
在模块范围或类范围中,变量被实现为 Python 字典中的条目。指向对象的指针存储在字典中。在较旧的 CPython 版本中,指针直接存储在 dict 的底层哈希表中,但从 CPython 3.6 开始,哈希表现在将索引存储到 dict 条目的密集数组中,并且指针位于该数组中。 (还有一些拆分键字典的工作方式略有不同。它们用于优化对象属性,您可能会或可能不会将其视为变量。)
在函数范围内,Python 创建一个堆栈帧对象来存储给定函数执行的数据,并且堆栈帧对象包含一个指向变量值的指针数组。变量被实现为这个数组中的条目,指向值的指针存储在数组中,每个变量都有一个固定的索引。 (字节码编译器负责确定这些索引。)