Skip to content

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()