FAQ
循环和闭包
Python 的闭包能读取外部申明的变量,外部变量修改也会导致闭包读取的变量修改。
Python 的 for 循环创建的变量位于同一层级,后一次循环会覆盖前一次循环的值。
python
data = [1, 2, 3, 4, 5]
func_list = []
for i in data:
func_list.append(lambda : print(i))
for func in func_list:
func()
这里将输出 5 个 5。
上面的代码等价于:
python
data = [1, 2, 3, 4, 5]
func_list = []
i = data[0]
func_list.append(lambda: print(i))
i = data[1]
func_list.append(lambda: print(i))
i = data[2]
func_list.append(lambda: print(i))
i = data[3]
func_list.append(lambda: print(i))
i = data[4]
func_list.append(lambda: print(i))
for func in func_list:
func()
解决方案
引入新的作用域python
data = [1, 2, 3, 4, 5]
func_list = []
for i in data:
def wrapper(inner_i):
return lambda : print(inner_i)
func_list.append(wrapper(i))
for func in func_list:
func()