1
njustyw 2014-01-13 10:49:29 +08:00
这个是闭包的问题吧
|
2
woshifyz 2014-01-13 10:51:04 +08:00
因为python奇怪的lexical scope,当内部函数中只读同名变量时,它就是外部变量;但当你写同名变量时,它就是局部变量。python3 中添加nonlocal来解决这一问题
你把 z=x+1 这行换成 x=10 就知道了 |
3
jayn1985 OP @njustyw 能详细说说么?inner函数通过作用域链使用outer函数的变量x,这个我了解,但是和locals方法结合起来看,有点糊涂了,一直没弄明白#1的结果是如何生成的
|
4
yeelone 2014-01-13 10:57:31 +08:00
这个属于闭包的概念,x 此时属于自由变量
|
5
jayn1985 OP @woshifyz 你说的这个我理解,我困惑的主要是在#1这行语句执行之前,并没有对变量x的读操作啊,为啥locals还能输出x呢?或者这个说,为啥y没有输出来但是却输出x了呢?
|
7
winfred 2014-01-13 11:17:14 +08:00
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()也输出被调用的自由变量。 |
8
jayn1985 OP @woshifyz 感谢指点,这个跟js的预编译是一样的概念么?如果预编译可以得知变量x,为啥变量z却没有输出呢?还是有些糊涂。。。
|
9
yuelang85 2014-01-13 14:06:34 +08:00
能用gist排下版吗?完全不明白楼主意图
|
10
woshifyz 2014-01-13 14:09:44 +08:00
@jayn1985 因为那个时候变量z还没有定义,而python在编译成opcode的时候就已经知道x是只读的,所以在inner中可以引用outer中的x,你可以理解为inner默认有一个const x=1,关于此,你可以看看lua中upvalue的处理
|
11
robinlovemaggie 2014-01-13 17:11:30 +08:00
|