Python函数的作用域及变量的作用域规则
Python函数的作用域规定了变量在哪个地方可以被访问或者被引用。Python的变量作用域规则分为四个级别,称为LEGB规则,即Local(局部作用域)、Enclosing(嵌套作用域)、Global(全局作用域)和Built-in(内建作用域)。
1. 局部作用域(Local):在函数内部定义的变量只能在该函数内部被访问,此外的其他地方都无法使用这些变量。这就是局部作用域。局部变量仅仅在函数的作用范围内有效,一旦函数执行完毕,局部变量就会被销毁。例如:
def my_func():
x = 10
print("局部变量x的值为:", x)
my_func()
print("局部变量x的值为:", x) # 报错,x无法在函数外部访问
2. 嵌套作用域(Enclosing):当函数嵌套定义时,内部函数可以访问外部函数的变量,但是外部函数无法访问内部函数的变量。嵌套作用域相当于每个函数在其外部函数的作用范围之内。例如:
def outer():
x = 20
print("外部函数中的x:", x)
def inner():
nonlocal x
x += 5
print("内部函数中的x:", x)
inner()
print("外部函数中的x:", x)
outer()
在这个例子中,内部函数inner()中的变量x使用了nonlocal关键字,表示这个x变量是外部函数outer()中的x变量。通过nonlocal关键字,我们将x的作用域扩展到了outer()函数中,从而使得inner()函数也可以访问并修改outer()函数中的x变量。
3. 全局作用域(Global):在函数的外部定义的变量属于全局作用域,可以在整个程序中被访问。全局变量的作用范围取决于它定义的位置和它在程序中的引用。全局变量一般定义在函数外部,但是也可以在函数内部使用global关键字进行声明和修改。例如:
x = 30
def my_func():
global x
x += 10
print("全局变量x的值为:", x)
my_func()
print("全局变量x的值为:", x)
在这个例子中,通过global关键字声明了x是一个全局变量,并在函数内部对x进行修改。
4. 内建作用域(Built-in):这个作用域包含了Python内建的函数和异常种类。在Python底层,一些内建的函数和异常会被默认添加到内建作用域中,因此我们无需手动导入就可以直接使用它们。例如:len()函数、print()函数和ValueError异常等。
总结来说,Python的变量作用域规则按照LEGB的顺序查找变量,即先在局部作用域中查找,然后是嵌套作用域,再是全局作用域,最后是内建作用域。如果在某个作用域中找不到变量,则会继续在下一个作用域中查找,直到找到或者无法找到为止。因此,在函数内部定义的变量优先级最高,其次是嵌套函数和全局作用域,最后是内建作用域。
