2

几乎和问题一样local, global, static, auto, register, extern, const, volatile 变量存储在哪里?,不同的是这个线程在询问 Python 语言是如何实现的。

4

1 回答 1

6

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

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

“全局”:实际上“全局”变量相对于定义它们的模块来说是全局的——有时它们被称为“模块级”变量而不是全局变量,因为在 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 对象兼容并由虚拟机管理的对象中。其中一些数据可以通过自省以编程方式访问——其中一些是不透明的。(例如,通过自省从拥有它们的函数内部检索非局部变量有点棘手)

于 2012-02-20T16:30:16.267 回答