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