CPython 中如何实现变量赋值?
How is variable assignment implemented in CPython?
我知道 Python 中的变量实际上只是 references/pointers 一些底层对象。由于它们是指针,我猜它们以某种方式 "store" 或以其他方式与它们引用的对象的地址相关联。
这样的 "address storage" 可能发生在 CPython 实现的较低级别。但
我对 C 的了解不足以从源代码中推断出这一点,我也不知道从源代码的何处开始查找。
那么,我的问题是:
在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者与之相关联?
在模块作用域或 class 作用域中,变量被实现为 Python 字典中的条目。指向对象的指针存储在字典中。在旧的 CPython 版本中,指针直接存储在 dict 的底层散列 table 中,但自从 CPython 3.6 以来,散列 table 现在将索引存储到密集的字典条目数组,指针在该数组中。 (也有工作方式略有不同的拆分键指令。它们用于优化对象属性,您可能会或可能不会将其视为变量。)
在函数范围内,Python 创建一个堆栈帧对象来存储给定函数执行的数据,并且堆栈帧对象包含一个指向变量值的指针数组。变量作为该数组中的条目实现,指向值的指针存储在数组中,每个变量的固定索引处。 (字节码编译器负责确定这些索引。)
我知道 Python 中的变量实际上只是 references/pointers 一些底层对象。由于它们是指针,我猜它们以某种方式 "store" 或以其他方式与它们引用的对象的地址相关联。
这样的 "address storage" 可能发生在 CPython 实现的较低级别。但 我对 C 的了解不足以从源代码中推断出这一点,我也不知道从源代码的何处开始查找。
那么,我的问题是:
在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者与之相关联?
在模块作用域或 class 作用域中,变量被实现为 Python 字典中的条目。指向对象的指针存储在字典中。在旧的 CPython 版本中,指针直接存储在 dict 的底层散列 table 中,但自从 CPython 3.6 以来,散列 table 现在将索引存储到密集的字典条目数组,指针在该数组中。 (也有工作方式略有不同的拆分键指令。它们用于优化对象属性,您可能会或可能不会将其视为变量。)
在函数范围内,Python 创建一个堆栈帧对象来存储给定函数执行的数据,并且堆栈帧对象包含一个指向变量值的指针数组。变量作为该数组中的条目实现,指向值的指针存储在数组中,每个变量的固定索引处。 (字节码编译器负责确定这些索引。)