📜  Python|调用或定义函数时的范围解析(1)

📅  最后修改于: 2023-12-03 15:19:22.605000             🧑  作者: Mango

Python | 调用或定义函数时的范围解析

在 Python 中,函数的定义和调用都涉及到一个重要的概念:范围解析。在本文中,我们将详细讨论什么是范围解析以及范围解析在 Python 函数中的实际应用。

什么是范围解析?

范围解析是指在 Python 中查找变量的规则。当 Python 遇到一个变量引用时,它会在一定范围内搜索该变量。如果找到了该变量,它将其返回。否则,Python 将抛出 "NameError" 异常。

Python 的搜索范围按以下顺序进行:

  1. 本地作用域(local):指函数内的变量或参数。

  2. 封闭作用域(enclosing):指任何包含本地作用域的父函数。

  3. 全局作用域(global):指函数定义所在的模块中的变量。

  4. 内置作用域(built-in):指内置的函数或变量。例如,"open()" 函数和 "print()" 函数都是内置的。

当 Python 遇到一个函数定义时,它会创建一个新的本地作用域。在该作用域中,所有实参都变成局部变量。当 Python 在函数中查找变量时,它首先查找该变量的本地作用域。如果找不到变量,则继续查找封闭作用域、全局作用域和内置作用域。

范围解析在 Python 函数中的实际应用

让我们看一些例子,以了解 Python 中范围解析的实际应用。

案例1:全局变量与局部变量
x = 50

def func(x):
    print('x is', x)
    x = 30
    print('Changed local x to', x)

func(x)
print('x is still', x)

输出:

x is 50
Changed local x to 30
x is still 50

在上面的例子中,我们定义了一个全局变量 "x",并将其设置为 50。然后,我们定义了一个函数 "func",该函数接受一个参数 "x"。在函数内部,我们首先使用 "print" 函数打印了局部变量 "x" 的值,结果为 50。然后,我们将局部变量 "x" 的值设置为 30,并再次使用 "print" 函数打印了局部变量 "x" 的值,结果为 30。最后,我们再次使用 "print" 函数打印了全局变量 "x" 的值,结果为 50。这是因为全局变量 "x" 没有被函数内的局部变量 "x" 所覆盖。

案例2:全局变量的修改
x = 50

def func():
    global x
    print('x is', x)
    x = 30
    print('Changed global x to', x)

func()
print('Value of x is', x)

输出:

x is 50
Changed global x to 30
Value of x is 30

在上面的例子中,我们定义了一个全局变量 "x",并将其设置为 50。然后,我们定义了一个函数 "func",该函数没有参数。在函数内部,我们使用 "global" 关键字来告诉 Python,我们要修改全局变量 "x"。然后,我们使用 "print" 函数打印全局变量 "x" 的值,结果为 50。接下来,我们将全局变量 "x" 的值设置为 30,并再次使用 "print" 函数打印全局变量 "x" 的值,结果为 30。最后,我们再次使用 "print" 函数打印全局变量 "x" 的值,结果为 30。

案例3:封闭作用域
def outer_func():
    x = 10
    
    def inner_func():
        nonlocal x
        x += 5
        print('x is', x)
        
    inner_func()
    print('x is', x)

outer_func()

输出:

x is 15
x is 15

在上面的例子中,我们定义了一个函数 "outer_func",该函数定义了一个局部变量 "x" 并将其设置为 10。然后,我们定义了一个内部函数 "inner_func"。在内部函数 "inner_func" 中,我们使用 "nonlocal" 关键字来告诉 Python,我们要修改 "outer_func" 中定义的 "x" 变量。然后,我们将 "x" 的值加上 5,并使用 "print" 函数打印出 "x" 的值,结果为 15。最后,我们再次使用 "print" 函数打印出 "x" 的值,结果仍然为 15。这是因为 "inner_func" 中的 "x" 是指 "outer_func" 中的 "x",而不是全局变量 "x"。

总结

范围解析是 Python 中的一个重要概念,它指定了 Python 查找变量的顺序。在函数中,Python 首先查找本地作用域,然后查找封闭作用域、全局作用域和内置作用域。这些规则可以帮助我们避免变量冲突,同时也可以让我们更好地管理变量的作用域和生命周期。