1
rcmerci 2014-12-25 18:13:38 +08:00
python2里面就是这样的。
好像python3改了(没用过3不确定) 所以我更喜欢js |
2
clino 2014-12-25 19:06:49 +08:00 via Android
问题出在 n += i 上,关键是有赋值,python 认为这里声明了一个局部变量
换个变量名就行 |
3
clino 2014-12-25 19:07:59 +08:00 via Android
def _inner(i):
j = n + i return j |
4
yjfuk 2014-12-25 19:08:41 +08:00
|
5
ffffwh 2014-12-25 19:12:25 +08:00 via Android
闭包也是函数式编程推广开来的概念,函数式编程一般要无副作用。在有副作用的环境下闭包该是个什么套路我是没想清楚的。
|
6
tombkeeper 2014-12-25 19:29:19 +08:00
use nonlocal
|
7
sujin190 2014-12-25 20:23:22 +08:00
里边用global n声明就行了
|
8
sujin190 2014-12-25 20:28:03 +08:00
好吧,还没注意过这样不行,直觉按python的设计应该是可以的,原来不行啊
|
11
bottleimp 2014-12-26 09:58:34 +08:00
lz 你要用闭包, 你就得有 immutable 的思想.
|
13
eriale OP @bottleimp 闭包不一定要immutable吧,这个例子是在<黑客和画家>看到的,Ruby/JS是可以直接修改被捕获的变量,我就想知道Python对闭包中变量的处理有哪些不一样?更进一步,Python这么设计有什么考虑吗?
|
14
bottleimp 2014-12-26 17:38:33 +08:00
@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 来处理这种情况. |