我(在我看来)对Python范围规则有一些基本的了解(基于对this answer的研究)。
我还从documentation on exec
了解到,它需要globals
和locals
作为可选参数,并且:
在所有情况下,如果省略了可选部分,则代码将在当前范围内执行。
注意:以下所有示例都假设使用了Python 3。
话虽如此,我最近偶然发现了这个案子,让我有点困惑:
def test(passed_data):
local_result = 5
exec("print(passed_data)")
exec("print(local_result)")
return local_result
print (test('whatever'))
运行上面的代码导致:
whatever
5
5
在这里,很明显exec
可以访问test
的本地人(passed_data
和'local_result')。
虽然我们会尝试改变其中任何一个:
def test(passed_data):
local_result = 5
exec("print(passed_data)")
exec("print(local_result)")
exec("passed_data = 222")
exec("local_result = 111")
exec("print(passed_data)")
exec("print(local_result)")
return local_result
print (test('whatever'))
它将导致:
whatever
5
whatever
5
5
在global
内使用exec
:
def test(passed_data):
local_result = 5
exec("print(local_result)")
exec("global local_result; local_result = 111")
exec("print(local_result)")
return local_result
print (test('whatever'))
给出了相同的结果(当然,因为local_result
是test
范围的本地范围):
5
5
5
让我们通过local_result
偶然exec
的机会 - 使用global
定义它:
def test(passed_data):
global local_result
local_result = 5
exec("print(local_result)")
exec("global local_result; local_result = 111")
exec("print(local_result)")
return local_result
print (test('whatever'))
这给了我们:
5
111
111
在我看来,我只是缺少对Python范围的基本理解或exec
的机制,以掌握这个案例。
尽管如此,我想了解以下内容:
exec
能够在不使用global
的情况下从功能范围打印变量,但无法更改?globals
和locals
被省略)exec
将执行任何Python代码,在其调用范围内,如如果这个代码只是在源代码中(没有exec
),那么我在这个假设中错误的地方(以及如何)? P.S。:我明白通过exec
改变局部变量并不是“正确的事情”,我只是为了学习而寻求对exec
范围规则的理解。