📅  最后修改于: 2023-12-03 15:19:22.605000             🧑  作者: Mango
在 Python 中,函数的定义和调用都涉及到一个重要的概念:范围解析。在本文中,我们将详细讨论什么是范围解析以及范围解析在 Python 函数中的实际应用。
范围解析是指在 Python 中查找变量的规则。当 Python 遇到一个变量引用时,它会在一定范围内搜索该变量。如果找到了该变量,它将其返回。否则,Python 将抛出 "NameError" 异常。
Python 的搜索范围按以下顺序进行:
本地作用域(local):指函数内的变量或参数。
封闭作用域(enclosing):指任何包含本地作用域的父函数。
全局作用域(global):指函数定义所在的模块中的变量。
内置作用域(built-in):指内置的函数或变量。例如,"open()" 函数和 "print()" 函数都是内置的。
当 Python 遇到一个函数定义时,它会创建一个新的本地作用域。在该作用域中,所有实参都变成局部变量。当 Python 在函数中查找变量时,它首先查找该变量的本地作用域。如果找不到变量,则继续查找封闭作用域、全局作用域和内置作用域。
让我们看一些例子,以了解 Python 中范围解析的实际应用。
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" 所覆盖。
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。
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 首先查找本地作用域,然后查找封闭作用域、全局作用域和内置作用域。这些规则可以帮助我们避免变量冲突,同时也可以让我们更好地管理变量的作用域和生命周期。