Python 闭包不支持修改 upvalue,有什么替代的解决方案?

2016-01-19 09:20:31 +08:00
 tabris17

如下代码:

def test_closure():
    x = 1
    def closure():
        x = 2
    closure()
    print x
test_closure()

x 仍然是 1

6227 次点击
所在节点    Python
67 条回复
alsotang
2016-01-19 14:47:22 +08:00
2.x 确实不支持 nonlocal ,还是用方法 2 吧。用个 dict 之类的,修改里面的属性。反正这个变量也是在函数内部用的, return 出去的时候该返回什么还是返回什么。
xuboying
2016-01-19 15:07:54 +08:00
@ethego 我倒不是 Python 黑,相反很多时候用 python ,只是更赞同 TMTOWTDI , PEP20 那句让人觉得小家子气。 python 能被别的语言认同当然也是好事。
ethego
2016-01-19 15:24:06 +08:00
@xuboying 追求理论的和谐可以试试 haskell 或者 ruby
fy
2016-01-19 15:42:53 +08:00
2 被续命了太久,早应迁移了。 3 解决了很多实际问题,但 3.0-3.2 都不是太理想, 3.3 以后就很顺了。
shyling
2016-01-19 15:43:15 +08:00
@tabris17 实际上接触 javascript 更多一点。。

var x =1;
x=2;
es6 有了块作用域是不是要再加个 let x=3;?
语法是为了简化代码,让代码更易读的。
tabris17
2016-01-19 16:15:58 +08:00
@shyling 块作用域解决了闭包的这个问题

for (var i=0; i< 4;i++){
setTimeout(function(){console.log(i);},1);
}

for (let i=0; i< 4;i++){
setTimeout(function(){console.log(i);},1);
}
kaneg
2016-01-19 23:03:00 +08:00
Java 也类似。 匿名类如果要引用外部类的变量,该外部变量需要声明为 final 的。所以一个变通的办法就是创建一个数组,在匿名类中修改数组中的元素已达到修改外部变量的目的。

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

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

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

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

© 2021 V2EX