我(在我看来)对 Python 范围规则有一些基本的了解(基于对这个答案的研究)。
我还从关于 的文档中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
s locals(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
),我在哪里(以及如何)在这个假设中错了?
PS:我知道更改局部变量 viaexec
不是“正确的做法”,我exec
只是为了学习而寻求对范围规则的理解。