这里发生的事情是模块 random 被导入为测试中的局部变量。试试这个
def test():
exec code
print globals()
print locals()
f()
将打印
{'code': '\nimport random\ndef f():\n print random.randint(0,9)\n', '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x02958BF0>, '__name__': '__main__', '__doc__': None}
{'random': <module 'random' from 'C:\Python27\lib\random.pyc'>, 'f': <function f at 0x0295A070>}
f
看不到的原因random
是它f
不是 --if 内部的嵌套函数test
:
def test():
import random
def f():
print random.randint(0,9)
f()
它会起作用的。但是,嵌套函数要求在编译外部函数时,外部函数包含内部函数的定义——这是因为您需要设置单元变量来保存两个(外部和内部)函数之间共享的变量。
要随机进入全局命名空间,您只需执行以下操作
exec code in globals(),globals()
关键字后面的 exec 参数in
是执行代码的全局和局部命名空间(因此,在 exec'd 代码中定义的名称被存储在其中)。