Python函数作用域与global、nonlocal关键字详解

晚来风
晚来风
发布时间:2026-10-11 | 3人浏览过
原创

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 关键字进行声明。

使用步骤与示例

  1. 声明变量:在函数内部使用 global 变量名 声明该变量为全局变量。
  2. 执行修改:随后对该变量进行赋值操作,即可修改全局作用域中的值。

以下代码演示了如何使用 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作用域与关键字的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表