我试图掌握python名称空间的细微差别。当封闭的func传递给包含eval的函数时,为什么eval()在列表comp上会失败?所有这些run2x版本都可以工作,除了最后一个run2g。
def sub2(var2):
var2 += 1
return var2
def run2c(): # This works by retrieving sub2 from globals
print('comp', eval('[sub2(n) for n in (1,2,3)]'))
def run2h(func): # Partial fix but cannot access globals in eval()
print('arg comp', eval('[func(n) for n in (1,2,3)]', locals()))
def run2h(func): # Fails again on func
print('arg comp', eval('[func(n) for n in (1,2,3)]', globals(), locals()))
def run2g(func): # This fails to use func in locals
print('arg comp', eval('[func(n) for n in (1,2,3)]')) # NameError: name 'func' is not defined
def run2a():
print('base', eval('sub2(1)'))
def run2b():
print('map', list(eval('map(sub2, (1,2,3))')))
def run2c_():
print('comp', eval('[sub2(n) for n in (1,2,3)]'))
def run2d(func):
print('arg', eval('func(1)'))
def run2e(func):
print('arg map', list(eval('map(func, (1,2,3))')))
def run2f(func):
print('arg plain', [func(n) for n in (1,2,3)])
def run2g_(func):
print('arg comp', eval('[func(n) for n in (1,2,3)]')) # NameError: name 'func' is not defined
if __name__ == "__main__":
run2a()
run2b()
run2c()
run2d(sub2)
run2e(sub2)
run2f(sub2)
run2g(sub2)
Python 3.6