exec()
给出了不同的输出,即使我传递了该函数所需的所有参数。请考虑以下代码:
def list_filter(expr,datalist,includelist) :
exec(expr)
print outlist
datalist=['try to kill me','black image']
includelist=['me']
expr="outlist = [i for i in datalist if all(j in i for j in includelist) ]"
exec(expr)
print outlist
list_filter(expr,datalist,includelist)
我在这里检查了类似的案例:How does exec work with locals?
但这是一个不同的错误,我使用版本2.7.13并且我在一般条件下检查,exec()
通常没有任何错误。我发现当出现“嵌套循环”时会出现此问题。内部列表理解语句,例如使用all()
或any()
。在这种情况下,如果我从列表推导中删除if condition
(使其成为expr = "outlist = [i for i in datalist ]"
),那么我将像往常一样获得正确的输出。
知道为什么吗?
答案 0 :(得分:0)
在这种情况下使用exec
几乎总是一个坏主意,你根本不应该使用它。
但是,因为你问:如果从本地范围传入变量,它可以正常工作:
def list_filter(expr, datalist, includelist):
exec(expr, locals())
print outlist
我对exec
的范围规则不是很熟悉,但我经常发现你需要明确地传递变量(特别是如果exec
不在全局范围内)。
在你的情况下,你甚至可以明确地传递它们:
def list_filter(expr, datalist, includelist):
exec(expr, {'datalist': datalist, 'includelist': includelist})
print outlist
甚至在documentation中说明您可能需要将变量从范围传递到exec
:
内置函数
globals()
和locals()
分别返回当前的全局和本地字典,这可能对传递给exec
使用很有用。