gpt4 book ai didi

python - python环境下查询local frame和global frame

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:03 25 4
gpt4 key购买 nike

从下面的程序中,我了解到下面环境图中的局部框架(方形)(蓝色框)属于(不过),调用()方法的局部ACTIVATION RECORD “功能”类的对象。这个“函数”类对象是在我们定义函数 square(x) 时在内部创建的。

enter image description here

我的问题是:

如果我上面的理解是正确的,那么全局框架属于谁(哪个类对象的方法)?

因为,我觉得,控件已经从对象(特定类类型)的某个方法传递给了 square.call(3) 方法。

最佳答案

当一个函数被定义时,它被分配了只读属性func_globals(又名__globals__自2.6以来,仅自3.0以来)对应于当前模块命名空间(比如 module.__dict__ 的 View )。你可以试试,例如:

>>> square.func_globals
# get a big dictionary-like object here

每次函数访问全局变量时都会查询此对象。当您稍后在其他模块中导入此函数时,它仍将保留对其原始范围的引用,并将从那里获取全局变量。换句话说,代码:

def square(x):
return mul(x, x)

大致等同于:

def square(x):
return globals()['mul'](x, x)

def square(x):
return square.func_globals['mul'](x, x)

所以,一句话:函数的全局变量属于定义它的模块,并通过函数对象的属性访问。

更新

下面发生的事情的更详细的版本(适用于 CPython)。了解 Python 最重要的一点是,与 C 等语言不同,它在“声明”和“执行”之间没有明确的区分。当你加载一个模块时,它的代码就会被简单地执行。当解释器遇到函数定义时,它会创建函数对象并将其分配给变量。任何已定义或导入到模块中的内容都将作为全局变量可供函数使用。让我们看一下函数对象:

>>> import dis
>>> dis.dis(square.func_code) # disassemble the function's bytecode
2 0 LOAD_GLOBAL 0 (mul)
3 LOAD_FAST 0 (x)
6 LOAD_FAST 0 (x)
9 CALL_FUNCTION 2
12 RETURN_VALUE
>>> square.func_code.co_names
('mul',)

开头可以看到代码LOAD_GLOBAL 0。这意味着:

  1. co_names中找到索引为0的名字,即'mul'
  2. func_globals中找到名字'mul'并加载到栈中
  3. 完成剩下的逻辑

关于python - python环境下查询local frame和global frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22741630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com