恐怕我不能准确地解释它,但它基本上是由于函数内部的b是局部的,并且
exec()
似乎要分配给全局b。您必须在函数内声明b为全局,
和
在exec语句中。
试试这个:
from sys import version
print(version)
def execute1(a, st):
b = 42
exec("b = {}\nprint('b:', b)".format(st))
print(b)
def execute2(a, st):
global b
b = 42
exec("global b; b = {}\nprint('b:', b)".format(st))
print(b)
a = 1.
execute1(a, "1.E6*a")
print()
execute2(a, "1.E6*a")
print()
b = 42
exec("b = {}\nprint('b:', b)".format('1.E6*a'))
print(b)
这给了我
3.3.0 (default, Oct 5 2012, 11:34:49)
[GCC 4.4.5]
b: 1000000.0
42
b: 1000000.0
1000000.0
b: 1000000.0
1000000.0
您可以看到,在函数外部,全局b被自动拾取。在函数内部,您正在打印本地b。
注意,我本以为
执行()
始终首先使用全局B,以便
execute2()
,您不需要在
执行()
功能。但我发现这行不通(这是我无法准确解释的部分)。