exec的范围规则是什么?

时间:2018-03-10 08:09:17

标签: python python-3.x scope python-exec

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

我还从documentation on 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可以访问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_resulttest范围的本地范围):

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),那么我在这个假设中错误的地方(以及如何)?
  3. P.S。:我明白通过exec改变局部变量并不是“正确的事情”,我只是为了学习而寻求对exec范围规则的理解。

0 个答案:

没有答案