分析一段代码
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
先说最下面的f1,f2,f3=counrt()
f1, f2, f3 = count()
相当于
[f1, f2, f3] = [f, f, f]
相当于
f1 = f
f2 = f
f3 = f
fs.append(f)
注意这里是将函数f添加到了fs中,而不是f返回的值,可以尝试执行命令:
>>> f <function f at 0x00000283BF7706A8> >>> count() [<function count.<locals>.f at 0x00000283BF770840>, <function count.<locals>.f at 0x00000283BF7707B8>, <function count.<locals>.f at 0x00000283BF770598>]
可见返回的是一个由三个函数组成的list。 因此当执行代码
f1, f2, f3 = count()
时,将count包含的三个函数按索引顺序分别赋给f1, f2, f3,而此时i=3,所以函数计算结果全部为9.
>>> f1() 9 >>> f2() 9 >>> f3() 9
在python中一切皆对象,而变量i只有一个,在三次循环中,它指向的对象变化了而已,而函数f1,f2,f3在实际执行的时候i指向的那个地址的实际存放数据已经变为3了,所以三次结果都是一样的。
fs.append(f)这里的f只是指针 不是函数 所以不执行 等到什么时候用什么时候执行 所以在for循环3次之后i变成了3 f总是在所有的执行完了才会去调用 因为它被放在【】中
不管调用几次count 他其中的for已经执行3次 i已经变成3所以此时执行f函数 使用的当然是3
本文出自 “生活就是等待戈多” 博客,请务必保留此出处http://chenx1242.blog.51cto.com/10430133/1769485
原文地址:http://chenx1242.blog.51cto.com/10430133/1769485