鱼油遇到的问题源于
Python中的变量作用域和如何在嵌套函数中访问和修改这些变量。
变量作用域
在Python中,变量的作用域决定了在哪些部分的代码中可以访问该变量。
具体到代码中,有以下几个作用域:
- 全局作用域:最外层定义的变量。
- 局部作用域:在函数内定义的变量。
- 嵌套函数作用域:在外层函数内部的函数中定义的变量。
- 内置作用域:Python的内置名称。
在代码中,函数 outter 包含了三个嵌套函数 innerA, innerB, 和 innerC,以及变量 x 的定义。
在 innerA 中,x = 100 是局部变量,它只在 innerA 中有效。因此,这里的赋值不影响外层函数 outter 中的 x。所以,当 innerA 调用完后,outter 中的 x 仍然保持原来的值 880。
innerB 使用了 nonlocal 关键字,这使得 innerB 中的 x 直接引用了外层函数 outter 中的 x。因此,innerB 中将 x 修改为 250 时,实际上修改的是 outter 中的 x。
innerC 使用了 global 关键字。但在此代码中,没有在全局作用域中定义 x,所以当 innerC 尝试设置 x = 520 时,它定义了一个新的全局变量 x。outter 中的 x 不受影响,仍然是由 innerB 设置的 250。
在调用 outter() 之后,输出全局变量 x 的值,这将显示 innerC 设置的全局 x 的值,即 520。
变量 x 的值在 innerA() 调用后仍为 880 的原因是因为
在 innerA 中对 x 的修改仅限于 innerA 的局部作用域,不影响外层函数 outter 中的 x。