You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

被声明为nonlocal的嵌套函数变量会被设置为怎样的值?

Python嵌套函数中nonlocal变量的取值逻辑

咱们来一步步拆解这个问题,先搞懂nonlocal的核心作用,再结合你给出的示例代码看它的具体取值变化~

首先,nonlocal关键字的本质

nonlocal是Python专门为嵌套函数设计的关键字,它的作用很明确:

  • 告诉Python:当前内层函数里的这个变量不是自己的局部变量,而是来自外层(非全局)函数的局部变量。
  • 有了这个声明,内层函数不仅能读取外层变量的值,还能直接修改它——修改后的结果会直接同步到外层函数的作用域中,而不是创建一个新的内层局部变量。

结合示例代码看nonlocal变量的取值变化

先看你给出的make_test_dice函数,咱们拿示例里的make_test_dice(1,2,3)来分析:

外层函数初始化阶段

当调用make_test_dice(1,2,3)时,外层函数会先做这些操作:

  1. 验证参数合法后,初始化index = len(outcomes) - 1,也就是3-1=2。
  2. 定义嵌套的dice函数,并用nonlocal index声明:这个index要用到外层函数里的那个变量。

每次调用dice()时的index变化

每次调用返回的dice函数,都会修改并使用这个外层的index:

  • 第一次调用dice():
    执行index = (index + 1) % len(outcomes),也就是(2+1)%3=0,此时外层的index被修改为0,对应返回outcomes[0](也就是1),和示例输出一致。
  • 第二次调用dice():
    基于上次修改后的index=0,计算得(0+1)%3=1,index变为1,返回outcomes[1](也就是2)。
  • 第三次调用dice():
    基于index=1,计算得(1+1)%3=2,index变为2,返回outcomes[2](也就是3)。
  • 第四次调用dice():
    基于index=2,计算得(2+1)%3=0,index又回到0,返回1,实现了循环遍历的效果。

补充:如果没有nonlocal会怎样?

如果去掉nonlocal index这行代码,直接在内层函数里写index = (index + 1) % len(outcomes),Python会报错——因为它会把index当成内层函数的局部变量,但在赋值前没有定义过这个变量,就会抛出UnboundLocalError。nonlocal的作用就是解决这个问题,让内层函数能直接操作外层的变量。

内容的提问来源于stack exchange,提问作者JamesMat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:41