其中,Python只有“local”、“global”和“nonlocal”变量。

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

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

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

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

“非局部”变量是在函数内部定义的函数(或其他代码,如类主体)的情况下,函数内部对外部范围内定义的变量的特殊引用。它们可以在运行的代码中检索,方法是获取func_closure属性—它是“cell”对象的元组。例如,要检索函数对象内第一个非局部变量的值,可以执行以下操作:_

function.func_closure[0].cell_contents-值与变量名分开保存,变量名可以作为function.func_code.co_varnames检索。(此命名方案对python2.x有效)

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