gpt4 book ai didi

python - python中嵌套函数的可变范围

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

我有一个演示示例:

def outer(func):

def inner(foo):
arg_inner=some_value
func(arg_inner,foo)

return inner

def third_party(arg1,arg2):
#do something

final = outer(third_party)
final(3)

我想知道内部函数是如何在调用时知道 func 的值的。内部功能范围和外部功能范围如何连接?

最佳答案

编译器将它们连接起来。

在编译outerinner时,outer中的func名称被标记为一个闭包,一个内部中的自由变量。在执行时,解释器然后知道将对 func 名称的引用从 outer 附加到 inner 函数对象作为闭包单元。

在字节码的反汇编中可以看到结果:

>>> import dis
>>> dis.dis(outer)
2 0 LOAD_CLOSURE 0 (func)
3 BUILD_TUPLE 1
6 LOAD_CONST 1 (<code object inner at 0x1079a5ab0, file "<stdin>", line 2>)
9 MAKE_CLOSURE 0
12 STORE_FAST 1 (inner)

4 15 LOAD_FAST 1 (inner)
18 RETURN_VALUE
>>> inner = outer(lambda a, b: None)
>>> dis.dis(inner)
3 0 LOAD_DEREF 0 (func)
3 LOAD_GLOBAL 0 (arg_inner)
6 LOAD_FAST 0 (foo)
9 CALL_FUNCTION 2
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE

LOAD_CLOSUREfunc 名称包装在一个闭包中,供 inner 使用; MAKE_CLOSURE 构建一个函数对象(来自用 LOAD_CONST 加载的字节码对象),并将附加的闭包单元作为元组。在 inner 中,LOAD_DEREF 操作码从 func 闭包中加载值。

可以在生成的 inner 函数对象上找到闭包:

>>> inner.func_closure
(<cell at 0x107a25a28: function object at 0x107a28b18>,)
>>> inner.func_code.co_freevars
('func',)
>>> inner.func_closure[0].cell_contents
<function <lambda> at 0x107a28b18>

因此 inner 函数对象带有闭包以供以后取消引用。

关于python - python中嵌套函数的可变范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18127203/

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