被声明为nonlocal的嵌套函数变量会被设置为怎样的值?
Python嵌套函数中nonlocal变量的取值逻辑
咱们来一步步拆解这个问题,先搞懂nonlocal的核心作用,再结合你给出的示例代码看它的具体取值变化~
首先,nonlocal关键字的本质
nonlocal是Python专门为嵌套函数设计的关键字,它的作用很明确:
- 告诉Python:当前内层函数里的这个变量不是自己的局部变量,而是来自外层(非全局)函数的局部变量。
- 有了这个声明,内层函数不仅能读取外层变量的值,还能直接修改它——修改后的结果会直接同步到外层函数的作用域中,而不是创建一个新的内层局部变量。
结合示例代码看nonlocal变量的取值变化
先看你给出的make_test_dice函数,咱们拿示例里的make_test_dice(1,2,3)来分析:
外层函数初始化阶段
当调用make_test_dice(1,2,3)时,外层函数会先做这些操作:
- 验证参数合法后,初始化
index = len(outcomes) - 1,也就是3-1=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
相关产品推荐
相关产品推荐

