当你在另一个函数中定义一个函数并且你在内部函数中引用外部函数的局部变量时,对外部函数的变量的引用被“捕获”。这可以在函数f1()的定义和调用中看到:
>>> import copy
>>> def f1 ():
... s = 'Hello'
... def g ():
... print(s)
... return g
...
>>> f1()()
Hello
但是如果使用exec()来定义函数,这似乎不起作用:
>>> import copy
>>> def f2 ():
... s = 'Hello'
... exec_locals = copy.copy(locals())
... exec('def g (): print(s)', globals(), exec_locals)
... return exec_locals['g']
...
>>> f2()()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in g
NameError: name 's' is not defined
>>>
这里出了什么问题?为什么f2()中定义的g()不知道名称s?
注意:在locals()返回的字典上调用copy.copy(),因为根据the documentation,“不应尝试修改默认的本地字典”。但是,如果您不打算复制,也会发生同样的事情。