Python函数作用域与global、nonlocal关键字详解
Python函数的作用域遵循LEGB规则,决定了变量查找的优先级。理解局部、嵌套、全局及内置作用域的区别,并掌握global和nonlocal关键字的正确使用,是编写健壮Python代码的关键。
Python作用域规则:LEGB
在Python中,变量的查找遵循特定的顺序,即LEGB规则。这一规则决定了当代码引用一个变量时,解释器会在哪些范围内进行搜索。
- L (Local):局部作用域。指当前函数内部定义的变量。
- E (Enclosing):嵌套作用域。指外层非全局函数的局部作用域,仅存在于嵌套函数中。
- G (Global):全局作用域。指模块级别定义的变量。
- B (Built-in):内置作用域。指Python系统固定模块内的变量,如内置函数int、print等。
变量搜索的优先级顺序为 L > E > G > B。这意味着局部变量的优先级最高,内置变量最低。
作用域的引入条件
需要注意的是,只有模块、类和函数这三个结构会引入新的作用域。像 if、try、for 等代码块并不会创建新的作用域,它们内部的变量会直接作用于当前所在的作用域。
关键字:global
在默认情况下,函数内部无法直接修改全局作用域中的变量。如果需要在函数内部修改全局变量,必须使用 global 关键字进行声明。
使用步骤与示例
- 声明变量:在函数内部使用
global 变量名声明该变量为全局变量。 - 执行修改:随后对该变量进行赋值操作,即可修改全局作用域中的值。
以下代码演示了如何使用 global 关键字修改全局变量 count:
count = 10
def outer():
global count#必须先声明count为全局变量
print(count)
count = 100
print(count)
outer()执行结果将依次输出初始值 10 和修改后的值 100。若不声明 global 直接赋值,Python会将其视为创建一个新的局部变量,而不会修改全局变量。
关键字:nonlocal
当涉及嵌套函数时,若内部函数需要修改外层非全局作用域(即 Enclosing 作用域)中的变量,必须使用 nonlocal 关键字。
使用场景与示例
nonlocal 专门用于修改嵌套作用域变量,此时不能使用 global 声明。内部作用域若先声明变量会覆盖外部变量;若不声明而直接使用,则会读取外部变量的值。
以下代码展示了如何使用 nonlocal 修改嵌套函数中的变量 count:
def outer():
count = 10
def inner():
nonlocal count #此时count非全局变量,不能用global声明,需要用到nonlocal关键字
count = 20
print(count)
inner()
print(count)
outer()在此示例中,inner 函数通过 nonlocal 修改了 outer 函数中的 count。执行 inner() 后,outer 函数中打印的 count 值也会变为 20。
总结
掌握LEGB规则有助于理解变量查找路径,而正确使用 global 和 nonlocal 则是控制变量作用域、避免意外覆盖的关键。开发者应根据实际需求,谨慎选择是否引入新的作用域或修改现有变量。
以上就是python函数的作用域及关键字详解的详细内容,更多关于Python作用域与关键字的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









