Python 的 nonlocal 关键字有何含义,什么时候使用?一文详解!
Python nonlocal 关键字详解
nonlocal 是 Python 3 引入的一个关键字,它存在的原因很简单:
👉 解决"内部函数想修改外层函数变量"的问题。
这是它唯一的作用。
下面我用最直观的方法让你彻底理解它。
🔥 1. 为什么需要 nonlocal?
看这个例子:
def outer():
x = 10
def inner():
x = x + 1 # ❌ 报错:UnboundLocalError
print(x)
inner()
outer()
你可能会以为 inner() 里面的 x 会使用 outer() 的 x,但是 Python 认为:
- 在 inner() 里出现了赋值
x = ...→ x 就是本地变量\ - 但你又在使用 x → 本地变量还没初始化 → 报错
报错:
UnboundLocalError: local variable 'x' referenced before assignment
⭐ 2. nonlocal 的作用:声明我不是用本地的 x,而是用外层函数的 x
修改一下:
def outer():
x = 10
def inner():
nonlocal x
x = x + 1
print(x)
inner()
outer()
输出:
11
📌 nonlocal 的意义:
👉 告诉 Python:inner() 里用的 x,不是局部变量,是外层函数作用域里的 x
(但不是全局变量)
📌 3. nonlocal 适用的场景
✔ 修改外层函数状态(闭包)
例如一个计数器:
def make_counter():
count = 0
def add():
nonlocal count
count += 1
return count
return add
counter = make_counter()
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3
如果没有 nonlocal,这个计数器根本无法实现。
📌 4. nonlocal vs global
关键字 作用范围 使用场景
global 模块全局变量 修改全局变量
nonlocal 外层函数变量 闭包内部修改外层变量
示例:
x = 10
def foo():
global x
x = 20
def outer():
y = 10
def inner():
nonlocal y
y = 20
📌 5. 为什么 Python 必须引入 nonlocal?
为了防止 变量作用域歧义。
如果没有 nonlocal:
x = x + 1
Python 无法判断:
- 是创建一个新的局部变量?\
- 还是修改 outer() 的变量?
所以必须用关键字明确声明:
nonlocal x→ 修改外层变量\global x→ 修改全局变量\- 不写关键字 → 创建局部变量
Python 遵循 "显式优于隐式",因此需要 nonlocal。
🔚 总结
nonlocal 的用途就一句话:
👉 在闭包中修改外层函数的变量。
它的出现是为了避免作用域冲突,同时让闭包能保存和修改状态。

浙公网安备 33010602011771号