1
njustyw 2014 年 1 月 13 日
这个是闭包的问题吧
|
2
woshifyz 2014 年 1 月 13 日
因为python奇怪的lexical scope,当内部函数中只读同名变量时,它就是外部变量;但当你写同名变量时,它就是局部变量。python3 中添加nonlocal来解决这一问题
你把 z=x+1 这行换成 x=10 就知道了 |
3
jayn1985 OP @njustyw 能详细说说么?inner函数通过作用域链使用outer函数的变量x,这个我了解,但是和locals方法结合起来看,有点糊涂了,一直没弄明白#1的结果是如何生成的
|
4
inyfee 2014 年 1 月 13 日
这个属于闭包的概念,x 此时属于自由变量
|
5
jayn1985 OP @woshifyz 你说的这个我理解,我困惑的主要是在#1这行语句执行之前,并没有对变量x的读操作啊,为啥locals还能输出x呢?或者这个说,为啥y没有输出来但是却输出x了呢?
|
7
winfred 2014 年 1 月 13 日
Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.
按官方文档,locals()也输出被调用的自由变量。 |
9
yuelang85 2014 年 1 月 13 日
能用gist排下版吗?完全不明白楼主意图
|
10
woshifyz 2014 年 1 月 13 日
@jayn1985 因为那个时候变量z还没有定义,而python在编译成opcode的时候就已经知道x是只读的,所以在inner中可以引用outer中的x,你可以理解为inner默认有一个const x=1,关于此,你可以看看lua中upvalue的处理
|
11
robinlovemaggie 2014 年 1 月 13 日
|