先贴出几段代码
def count():
fs = []
for i in range(1,4):
def f():
return i * i
fs.append(f)
return fs
f1, f2, f3 = count()
def count():
fs = []
for i in range(1,4):
j = i
def f():
return j * j
fs.append(f)
return fs
f1,f2,f3 = count()
def count():
fs = []
for i in range(1,4):
def f(j):
def k():
return j * j
return k
fs.append(f(i))
return fs
f1,f2,f3 = count()
结果就不给答案了,不会可以动手试下。但是为什么会产生这样的结果呢?(⊙v⊙)嗯~答案在于迭代。前面那两个代码段的迭代由于创建的新函数都是引用其父函数的变量(暂时认为是父函数吧,因为我也不知道该叫什么),而父函数的变量由于循环而不断的更新其值,所以才导致结果都为一样。父函数的循环以及新创建的子函数并不是串行执行的,而是异步的。
在golang中也有这样的一段代码
s := []int{1,2,3}
for _, i := range s {
go func(){
println(i)
}()
}
time.Sleep(5000)
执行的结果为
3
3
3
这个是因为range的速度远远比新开出来的goroutine执行的速度开,从而导致每个goroutine使用的变量i 的值都为3
解决方法
s := []int{1,2,3}
for _, i := range s {
go func(j int){
println(j)
}(i)
}
time.Sleep(5000)
总结:在函数编程的时候特别需要注意的函数的执行顺序。尽量少引用父函数的变量。