我期望以下结果成为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?
似乎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)