导读:本期聚焦于小伙伴创作的《Python变量作用域规则是什么?LEGB模型如何在实际开发中应用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Python变量作用域规则是什么?LEGB模型如何在实际开发中应用》有用,将其分享出去将是对创作者最好的鼓励。

Python作为动态类型语言,变量的可访问范围由作用域规则决定,官方定义的LEGB模型是变量查找的核心依据,四个字母分别对应Local、Enclosing、Global、Built-in四个作用域层级,变量查找会严格按照这个顺序从内到外进行。

Python变量作用域规则是什么?LEGB模型如何在实际开发中应用

LEGB模型各层级含义

Local 局部作用域

局部作用域指的是函数内部定义的变量,仅在当前函数执行时有效,函数执行结束后变量会被销毁。比如下面示例中函数内部的x就是局部变量:

def func():
    x = 10  # 局部作用域变量
    print(x)

func()  # 输出10
print(x)  # 报错,x不在全局作用域中

Enclosing 外部嵌套作用域

外部嵌套作用域出现在嵌套函数中,指的是外层函数的作用域,内层函数可以访问外层函数的变量。如果内层函数和外层函数有同名变量,内层会优先使用自己的局部变量:

def outer():
    y = 20  # 外部嵌套作用域变量
    def inner():
        print(y)  # 访问外层函数的y
    inner()

outer()  # 输出20

Global 全局作用域

全局作用域指的是模块层级定义的变量,在整个模块的任意函数中都可以访问,但如果要在函数内部修改全局变量,需要使用global关键字声明:

z = 30  # 全局作用域变量

def func():
    global z
    z = 40  # 修改全局变量z
    print(z)

func()  # 输出40
print(z)  # 输出40,全局变量已被修改

Built-in 内置作用域

内置作用域是Python解释器启动时加载的作用域,包含内置函数、内置异常等,比如printlenint都属于内置作用域的内容,所有代码都可以直接调用:

# 内置函数属于内置作用域
print(len([1,2,3]))  # 输出3,len是内置函数
print(int("100"))    # 输出100,int是内置类型

LEGB模型的查找顺序验证

当代码中引用一个变量时,Python会按照Local -> Enclosing -> Global -> Built-in的顺序依次查找,找到第一个匹配的变量就停止查找,如果四个层级都没有找到就会抛出NameError异常。

# 四个层级都有同名变量的场景
name = "global_name"  # 全局作用域

def outer():
    name = "enclosing_name"  # 外部嵌套作用域
    def inner():
        name = "local_name"  # 局部作用域
        print(name)  # 优先使用局部作用域的变量
    inner()

outer()  # 输出local_name

如果把inner函数中的name定义删除,就会查找外层outer的name:

name = "global_name"

def outer():
    name = "enclosing_name"
    def inner():
        # 没有定义局部name,查找外层enclosing作用域
        print(name)
    inner()

outer()  # 输出enclosing_name

LEGB模型的实际应用注意事项

  • 避免在局部作用域修改外层变量时忘记声明关键字,修改全局变量要用global,修改外部嵌套作用域变量要用nonlocal
  • 不要滥用全局变量,全局变量会增加代码的耦合度,也容易引发变量被意外修改的问题
  • 内置作用域的变量不要被自定义变量覆盖,比如不要定义名为listprint的变量,否则会覆盖内置函数导致后续调用出错

闭包是LEGB模型的典型应用场景,内层函数可以捕获外层函数的变量状态,即使外层函数已经执行结束,内层函数依然可以访问这些变量:

def counter():
    count = 0  # 外部嵌套作用域变量,被内层函数捕获
    def increment():
        nonlocal count  # 声明修改外部嵌套作用域的count
        count += 1
        return count
    return increment

c = counter()
print(c())  # 输出1
print(c())  # 输出2
print(c())  # 输出3

掌握LEGB模型后,开发者可以快速定位变量相关的报错,也能更合理地设计变量的作用范围,写出更健壮的Python代码。

PythonLEGB_modelvariable_scope作用域规则修改时间:2026-07-22 09:45:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。