一、Python 4 种作用域(LEGB 规则)

Python 有固定 4 层作用域,查找变量时从内到外依次找,找不到就报错:

缩写 名称 含义 例子
L Local(局部) 函数 / 方法内部 函数里定义的变量
E Enclosing(嵌套) 外层函数(闭包) 嵌套函数的外层变量
G Global(全局) 模块顶层 文件最外层定义的变量
B Built-in(内置) Python 内置 printlenint

一句话总结:变量查找顺序:L → E → G → B


二、逐一看懂每种作用域

1. Local(局部作用域 L)

函数内部定义的变量,只能在函数内部用。

def func():
    x = 10  # 局部变量
    print(x)  # 可以访问

func()       # 输出 10
print(x)     # 报错!外部无法访问

2. Enclosing(嵌套作用域 E)

嵌套函数里,外层函数的变量

def outer():
    msg = "hello"  # E 作用域

    def inner():
        print(msg)  # 能访问外层函数的 msg

    inner()

outer()  # 输出 hello

3. Global(全局作用域 G)

整个文件顶层定义的变量,整个模块都能访问。

name = "小明"  # 全局变量

def say_hello():
    print(name)  # 可以直接读取全局变量

say_hello()  # 小明

⚠️ 注意:函数里想修改全局变量,必须加 global不加会创建新的局部变量,不会修改全局变量。

count = 0

def add():
    global count  # 声明用全局变量
    count += 1

add()
print(count)  # 1

4. Built-in(内置作用域 B)

Python 自带的关键字、函数,任何地方都能用:printlenliststrsum 等。


三、最容易踩的坑

坑 1:函数内直接赋值 = 创建新局部变量

a = 100

def test():
    a = 200  # 这里不是修改全局 a,而是创建了局部 a!
    print(a)

test()   # 200
print(a) # 100(全局没变)

坑 2:嵌套函数修改变量要用 nonlocal

def outer():
    num = 10

    def inner():
        nonlocal num  # 声明用外层函数变量
        num = 20

    inner()
    print(num)  # 20

outer()

四、一句话记住所有规则

LEGB:局部 → 嵌套外层 → 全局 → 内置

  • 读变量:直接用
  • 改全局:global
  • 改嵌套外层:nonlocal

总结

  1. Python 作用域遵循 LEGB 规则
  2. 局部变量只能在函数内访问
  3. 函数修改全局变量 → global
  4. 嵌套函数修改外层变量 → nonlocal
  5. 查找顺序永远是从内到外
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐