在Python中,函数的作用域规则遵循LEGB规则,这是Python语言中的一个重要概念。LEGB规则指的是局部作用域(Local)、封闭作用域(Enclosing)、全局作用域(Global)和内置作用域(Built-in)这四种作用域的优先级顺序。
- 局部作用域(Local):这是函数内部定义的作用域,函数内部的所有变量都属于局部作用域。当在函数内部访问一个变量时,Python首先会在局部作用域中查找该变量。如果找不到,则会继续查找封闭作用域、全局作用域和内置作用域。
- 封闭作用域(Enclosing):这是指包含当前函数的外部函数的作用域。如果当前函数内部定义了一个变量,但是在函数外部也有一个同名的变量,那么在函数内部访问这个变量时,Python会优先查找封闭作用域中的变量。需要注意的是,封闭作用域仅指直接包含当前函数的外部函数的作用域,而不包括更外层的外部函数。
- 全局作用域(Global):这是Python程序的全局作用域,包含了所有模块级别的变量和函数。当在函数内部访问一个全局变量时,Python会在全局作用域中查找该变量。如果找不到,则会继续查找局部作用域、封闭作用域和内置作用域。
- 内置作用域(Built-in):这是Python语言内置的作用域,包含了所有内置函数和异常。当在函数内部访问一个内置函数或异常时,Python会在内置作用域中查找该函数或异常。如果找不到,则会继续查找局部作用域、封闭作用域和全局作用域。
需要注意的是,如果在函数内部想要修改全局变量,必须使用global
关键字声明该变量为全局变量。否则,Python会将该变量视为局部变量,并在函数内部对其进行赋值操作时抛出UnboundLocalError
异常。
另外,Python还支持嵌套函数的作用域规则。嵌套函数可以访问其外部函数的变量,包括嵌套函数内部定义的变量。但是需要注意的是,嵌套函数只能在其外部函数的作用域内访问这些变量,而不能访问更外层的外部函数或其他模块的变量。