我有两个代码让我很困惑。在
def get_context():
__gc = globals()
__lc = locals()
def precompiler(code):
exec code in __lc
def compiler(script, scope):
return compile(script, scope, 'eval')
def executor(expr):
return eval(expr, __gc, __lc)
return precompiler, compiler, executor
maker1, compiler1, executor1 = get_context()
maker2, compiler2, executor2 = get_context()
maker1("abc = 123")
maker2("abc = 345")
expr1 = compiler1("abc == 123", "test.py")
print "executor1(abc == 123):", executor1(expr1)
print "executor2(abc == 123):", executor2(expr1)
结果是:
执行者1(abc==123):真
executor2(abc==123):错误
为什么编译只在闭包中执行一次,而字节码可以在两个闭包中运行?在
这里还有另一个代码:
^{pr2}$结果是:
名称错误:名称“test_var”未定义
这是怎么发生的?在
为什么编译需要检查闭包的环境(变量或其他一些),而它不依赖于闭包?这就是我所困惑的!在
对于第一个问题,compile只接受python代码并生成字节码。它不依赖于编译它的闭包。如果你拿出一根绳子,那就没什么不同了。该字符串不是永久绑定到创建它的函数上,代码对象也不是。在
对于第二个问题,locals()在调用时会生成一个局部变量字典。因为您在调用locals之后设置了test_var,所以它没有它。如果您想在本地函数内部测试_var,则需要在以后调用它。在
在第一个示例中,在第一个上下文中执行“abc=123”,在第二个上下文中执行“abc=345”。所以“test_var==123”在第一个上下文中为true,在第二个上下文中为false。在
在您的第二个例子中,您发现了一个有趣的情况,解释程序从上下文中删除了test_var,因为test_var没有被引用。在
相关问题 更多 >
编程相关推荐