jsb*_*eno 6

其中,Python 只有“本地”、“全局”和“非本地”变量。

其中一些存储在 Dictionary 或类似字典的对象中,通常可以显式寻址。

“全局”:实际上,“全局”变量相对于定义它们的模块而言是全局的——有时它们被称为“模块级”变量而不是全局变量,因为在 C 中使用全局变量的大多数弊端都不适用——因为当使用模块级全局变量时,既不会有命名冲突,也不会知道某个名称是否来自。

它们的值存储在可用作模块对象的“__dict__”属性的字典中。重要的是要注意,模块中的所有名称都以这种方式存储 - 因为 Python 中的名称指向任何一种对象:也就是说,在语言级别上没有区别,“变量”、函数或类在模块:所有这些对象的名称将是“__dict__”特殊属性中的键,该属性由语言直接访问。是的,可以在运行时使用通常的“setattr”插入或更改模块中变量指向的对象,甚至可以直接更改模块的 __dict__ 。

"local":局部变量在 "locals()" 内置函数调用返回的字典中可用于 "用户代码"。该字典由当前正在运行的代码框架的“f_locals”属性引用。由于有多种方法可以检索调用当前运行代码的函数的代码框架,因此可以使用 f_locals 属性检索这些函数中可用变量的值,尽管在 CPython 实现中,更改 f_locals 字典中的值不会反映运行代码的实际变量值 - 这些值由字节码机制缓存。

“非本地”变量是特殊引用,在函数内部指向外部作用域中定义的变量,在函数内部定义的函数(或其他代码,如类主体)的情况下。它们可以在运行代码中通过获取 func_closure 属性来检索——它是一个“单元”对象的元组。例如,要检索函数对象中第一个非局部变量的值,可以这样做:_ function.func_closure[0].cell_contents- 值与变量名分开保存,变量名可以作为function.func_code.co_varnames. (此命名方案对 Python 2.x 有效)

底线:变量“值”始终保存在与 Python 对象兼容并由虚拟机管理的对象中。其中一些数据可以通过内省以编程方式访问 - 其中一些是不透明的。(例如,通过内省从拥有它们的函数内部检索非局部变量有点棘手)

  • 好答案。然而,我对本地如何在 CPython 中工作的理解是,它们存储在 C 数组中(在框架对象上),并使用整数索引而不是字符串键进行访问。`locals()` 返回的字典更多地使用缓存值而不是其他方式。 (2认同)