1

我(在我看来)对 Python 范围规则有一些基本的了解(基于对这个答案的研究)。

我还从关于 的文档中exec了解到,它采用globalslocals作为可选参数,并且:

在所有情况下,如果省略了可选部分,则代码将在当前范围内执行。


注意:以下所有示例均假定使用 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访问tests 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,无法掌握这种情况。
不过,我想了解以下内容:

  1. 为什么exec能够从函数范围打印变量,而不使用global,但不能改变它?
  2. 我的理解是(给定globalslocals被省略exec将在调用它的范围内执行任何 Python 代码,就好像这段代码只是在源代码中(没有exec),我在哪里(以及如何)在这个假设中错了?

PS:我知道更改局部变量 viaexec不是“正确的做法”,我exec只是为了学习而寻求对范围规则的理解。

4

0 回答 0