【问题标题】:where python store global and local variables?python在哪里存储全局变量和局部变量?
【发布时间】:2012-02-20 15:23:47
【问题描述】:

几乎与问题Where are the local, global, static, auto, register, extern, const, volatile variables are stored? 相同,不同之处在于该线程询问Python 语言如何实现这一点。

【问题讨论】:

  • 您要问的是哪个 Python 实现? CPython?
  • @GregS:这个问题是关于 C 和 Objective C 的,这是关于 Python 的。虽然这两个问题都没有指定实现,但我想在这两种情况下,正确的答案都是“它可以在任何地方”。
  • 我知道这个问题可能会更详细 - 但我认为没有理由如此严重地反对它。它是“合法的”,答案完全不依赖于 Python 实现。
  • @jsbueno:我没有投反对票,但“记忆中”的答案似乎适用,这不是 OP 所追求的。我想知道 OP 是否想要动态访问属性,还是什么?
  • 我不能再问问题了,我想设置套件级变量,测试用例级变量,所以了解python的实现是有帮助的。

标签: python implementation language-implementation


【解决方案1】:

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

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

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

它们的值存储在作为模块对象的“__dict__”属性可用的字典中。重要的是要注意模块中的所有名称都以这种方式存储 - 因为 Python 中的名称指向任何一种对象:也就是说,在语言级别上没有区别,“变量”,函数或类在一个模块:所有这些对象的名称将是“__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 对象兼容并由虚拟机管理的对象中。其中一些数据可以通过自省以编程方式访问——其中一些是不透明的。 (例如,通过自省从拥有它们的函数内部检索非局部变量有点棘手)

【讨论】:

  • 好答案。然而,我对局部变量如何在 CPython 中工作的理解是,它们存储在 C 数组中(在框架对象上),并使用整数索引而不是字符串键进行访问。 locals() 返回的字典更多的是使用缓存值而不是相反。
  • 您描述的这种存储是我在上面的答案中称为“由字节码机器缓存”的存储。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多