究竟是什么会导致函数的 __code__.co_freevars 非空?

Dav*_*ida 4 python

我期望以下结果成为y自由变量:

def f(x):
    return x + y
Run Code Online (Sandbox Code Playgroud)

然而,f.__code__.co_freevars等于()f.__code__.co_varnames等于('x',)、并且f.__code__.co_names等于('y',)

那么,到底是什么会导致变量 use 填充呢co_freevars

mpo*_*tes 5

似乎co_freevars只有在存在闭包时才会填充,即在外部函数中定义内部函数。

尽管访问非局部变量,模块级函数仍__closure__设置为:None

y = 1

def foo(x):
    return x + y

print(foo.__closure__)
print(foo.__code__.co_freevars)
Run Code Online (Sandbox Code Playgroud)

输出:

None
()
Run Code Online (Sandbox Code Playgroud)

相对于:

None
()
Run Code Online (Sandbox Code Playgroud)

输出:

(<cell at 0x7fa8fbbf0700: int object at 0x7fa8fbc7a930>,)
1
('y',)
Run Code Online (Sandbox Code Playgroud)