用 closure 实现的叠加器(counter)出错,求解释原因

2014-04-08 23:09:33 +08:00
 wenLiangcan
(似乎没法分开显示不同的文件。。。)

看了这篇文章(http://coolshell.cn/articles/10739.html),有一个 Lua 写的 counter,觉得有趣:
https://gist.github.com/wenLiangcan/10135400#file-counter-lua

于是学着用 Python 写了一下,可是出错了:
https://gist.github.com/wenLiangcan/10135400#file-er_counter-py

搜索后看到这篇文章(http://jjinux.blogspot.com/2006/10/python-modifying-counter-in-closure.html),说把记录计数的变量换做列表就可以了:
https://gist.github.com/wenLiangcan/10135400#file-counter-py

请问这是为什么呢?上面文章提到的“to box variables within a closure”又是什么意思?

https://gist.github.com/10135400

谢谢
2817 次点击
所在节点    Python
7 条回复
monsterxx03
2014-04-08 23:47:00 +08:00
python闭包的经典问题

i+=1 等价于i = i + 1, 语句从左向右执行,先是`i=`, 注意这里就覆盖了外部的i,实际上外部的i已经不可见了,然后`i+1`, 但此时外部的i在当前作用域中已经不可见,内部的i还未创建完成,等号右边的还没执行完成呢。。。所以会找不到这个i。

lua能过,应该是语法解释器内部的逻辑和python不一样吧。
wenLiangcan
2014-04-08 23:58:55 +08:00
@monsterxx03 那为什么列表又不会被覆盖呢?
monsterxx03
2014-04-09 00:04:55 +08:00
因为 i= xxx是在定义变量, i[0] =xxx 不是定义,只是赋值操作。
wenLiangcan
2014-04-09 00:22:28 +08:00
@monsterxx03 原来如此!
josephok
2014-04-12 16:10:23 +08:00
试试:
<script src="https://gist.github.com/josephok/10524138.js"></script>
josephok
2014-04-12 16:12:08 +08:00
wenLiangcan
2014-04-15 21:31:52 +08:00
@josephok 原来还有 nonlocal 这个关键字,学习了,v2ex 竟然没有提醒,现在才看到。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/107745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX