@
eriale 我对 ruby 还有 JS 不熟, 单纯的从 python 的角度看, 我觉得这个是跟语言具体实现时候有关的.
一个函数, 背后实际应该是由一个环境(env) 跟一个函数来组成的. python 中对这个 env 里的变量, 还会区分是否 local. 当函数里有赋值的变量, 可以认为打上了 local 标记, 并且 shadow 了env 中原有的同名变量.
所以在使用 n = n + 1 这种语句的时候, 一旦 python 需要计算表达式 n+1 的值, 它就会认为这个 n 是 local varible, 并且还没有 bind, 就会抛 UnboundLocalError.
同样的情况你在最外层的函数也会有, 只是最外层函数我们可以用 global 来限定, 但是你这个是闭包, 相当于中间那层有个变量 n 要在最里层用, 对于这种情况, python2 里面就没有类似 global 这样的对应方法, 在 python3中加了 nonlocal 来处理这种情况.