简单的记录一下在日常工作中遇到的python 闭包中的延迟绑定问题,如下例子:
# -*- coding: utf-8 -*-
def fun():
return [lambda x: x**i for i in range(5)]
for f in fun():
print f(2)
看上去输出应该是依次输出0-4的平方,但是结果却是:
C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
16
16
16
16
16
这里的原因就是在python中,相对而言的局部变量绑定的是值,非局部变量绑定的是空间,而不是值得本身,在上面得例子中,for循环得i,相对于lambda函数而言,是全局变量,所以绑定得是空间,最终导lambda函数运行得时候,读取得是最后保存i的值,解决办法是通过函数的默认赋值,达到保存临时变量的作用,代码如下:
def fun():
return [lambda x, i = i: x**i for i in range(5)]
for f in fun():
print f(2)
这样的结果就是:
C:\Python27\python.exe C:/python_prac/Script/pickledb_prac.py
1
2
4
8
16
lambda函数精简,在使用的过程一定要小心这个坑!