与问题Where are the local, global, static, auto, register, extern, const, volatile variables are stored?几乎相同,不同之处在于该线程正在询问Python语言如何实现这一点。
答案 0 :(得分:3)
在所有这些中,Python只有“本地”,“全局”和“非本地”变量。
其中一些存储在字典或字典中,如对象,通常可以明确地解决。
“global”:实际上“全局”变量相对于定义它们的模块是全局的 - 有时它们被称为“模块级”变量而不是全局变量,因为大多数的变量都是在C中使用全局变量不适用 - 因为在使用模块级全局变量时,既不会发生命名冲突,也不会知道某个名称来自何处。
它们的值存储在可用作模块对象的“__dict__”属性的字典中。重要的是要注意模块中的所有名称都以这种方式存储 - 因为Python中的名称指向任何一个对象:也就是说,语言级别,“变量”,函数或类中没有区别。 module:所有这些对象的名称将是“__dict__”特殊属性中的键,该属性可由语言直接访问。是的,可以在运行时使用通常的“setattr”插入或更改模块中变量指向的对象,甚至可以直接更改模块的__dict__。
“local”:“locals()”内置函数调用返回的字典中的“用户代码”可以使用局部变量。该字典由正在运行的当前代码帧的“f_locals”属性引用。由于有多种方法可以检索调用当前运行代码的函数的代码框,因此可以使用f_locals属性检索这些函数中可用变量的值,尽管在CPython实现中,更改f_locals字典中的值不会反映运行代码的实际变量值 - 这些值由字节码机器缓存。
“nonlocal”变量是特殊引用,在函数内部,在外部作用域中定义的变量,在函数内定义的函数(或其他代码,如类主体)的情况下。通过获取func_closure属性(可以是“单元格”对象的元组),可以在运行代码中检索它们。例如,要检索函数对象中第一个非局部变量的值,可以执行以下操作:_
function.func_closure[0].cell_contents
- 值与变量名称分开,可以检索为function.func_code.co_varnames
。 (此命名方案适用于Python 2.x)
底线:变量“值”始终保存在与Python对象兼容且由虚拟机管理的对象中。其中一些数据可以通过内省以编程方式访问 - 其中一些是不透明的。 (例如,通过内省检索来自拥有它们的函数内部的非局部变量有点棘手)