我有这段代码:
def test(variable, customCode = ""):
if variable > 1:
print(">1")
if customCode != "":
exec(customCode)
if foo == 1:
print("Success")
numb = 12
code = "if variable > 1: foo = 1"
test(numb, code)
执行时会出现以下错误:
那么,我在代码的开头添加了foo = 0
,得到了这个输出:
现在,显然,它也应该输出Success
,但它不是。
问题是什么?
使用Python 3.
答案 0 :(得分:4)
正确的方法是将一个dict传递给python 3中的exec并按键查找,在python2中你的代码将按原样运行,因为exec是一个语句而不是python3中的函数:
def test(variable, customCode = ""):
d = {"variable":variable}
if customCode != "":
exec(customCode, d)
if d["foo"] == 1:
print("Success")
numb = 12
code = "if variable > 1: foo = 1"
test(numb, code)
输出:
In [13]: numb = 12
In [14]: code = "if variable > 1: foo = 1"
In [15]: test(numb, code)
Success
注意默认的locals的行为与下面的函数locals()相同:不应尝试修改默认的locals字典。如果您需要在函数exec()返回后查看代码对locals的影响,则传递显式的locals字典。
您还需要了解if variable > 1
为假的情况,因为您永远不会执行代码,因此永远不会添加foo。
答案 1 :(得分:0)
阅读@Padraic Cunningham的帖子给了我一个想法,作为一个解决方案:
这很简单:不只是: foo = 1
,而是: global foo; foo = 1
。
更改了代码:
def test(variable, customCode = ""):
if variable > 1:
print(">1")
if customCode != "":
exec(customCode)
if foo == 1:
print("Success")
numb = 12
code = "if variable > 1: global foo; foo = 1"
test(numb, code)
问题是exec()
是函数而不是Python 3中的语句,因此foo
被用作局部变量。 (资料来源:@Padraic Cunningham)