闭包中引用循环变量的问题
来源:互联网 发布:大数据商务拓展怎么做 编辑:程序博客网 时间:2024/04/30 16:16
今天在看Go的语法,突然想对比一下python和Go的闭包机制的区别。
假如闭包调用循环变量,在Go中的实现方法为,循环中用一个新的变量保存这个循环变量的值,具体实现代码如下:
//Gopackage mainimport ("fmt""reflect")func main() {var funcArray = count()for index := range funcArray {funcArray[index]()}}func count() []func() {var a = make([]func(), 3)for index := range a {indexCopy := indexa[index] = func() {fmt.Println(indexCopy)}}return a}
三次循环中产生了三个新的indexCopy的量,于是这个程序最后打印出0, 1, 2.
但是在python中,必须这样实现:
#pythondef count(): l = [] for i in range(3): def f(i): def g(): return i return g l.append(f(i)) return lf1, f2, f3 = count()print f1()print f2()print f3()
先构造一个函数f(i)把i的值固定住,加入list中,实现引用循环变量的功能。
这时候问题来了,为什么python不能像go一样,新建一个循环变量的拷贝,像下面这样呢:
#pythondef count(): l = [] for i in range(3): v = i def f(i): return v l.append(f(i)) return l这是python gc决定的。在for的三次循环中,变量v的地址是不变的,只是每次循环分别指向了常量区不同的常量。所以到了最后三个闭包函数所保存的v地址是一样的,而且都指向了常量区中的2,而Go中则是三个闭包函数保存着三个indexCopy变量的地址。
0 0
- 闭包中引用循环变量的问题
- block:解决成员变量的循环引用的问题
- block:解决成员变量的循环引用的问题
- 循环引用的问题...
- Block的引用循环问题 (ARC & non-ARC) 【 引用外部变量或对象 】
- JavaScript的闭包问题(闭包解决引用循环变量的问题)
- spring循环引用的问题
- block 循环引用的问题
- Block的循环引用问题
- Block的循环引用问题
- block的循环引用问题
- Block的循环引用问题
- Block的引用循环问题
- block循环引用的问题
- NSTimer循环引用的问题
- JS循环引用的问题
- NSTimer的循环引用问题
- 引用计数法的循环引用问题
- Servlet(三)--cookie
- 互联网后端基础设施
- 用UML准确的表达系统--细节
- LeetCode 343. Integer Break
- 大数据Spark “蘑菇云”行动第105课:Hive源码大师之路第三步:Hive序列化与反序列原理内幕和源码解析
- 闭包中引用循环变量的问题
- C++中new的用法
- 蓝桥 数字游戏
- Microsoft visual studio关闭安全检查
- Spring加载配置文件的几种方法(出现错误的时候可以查看)
- 24、(知识篇)SpringMVC01(SpringMVC HelloWorld)
- c++和java语言特性的不同(一个c++开发者眼中的java)
- mybatis入门系列(七)
- 文章标题