首页 > 解决方案 > 生成器中的奇怪函数闭包行为

问题描述

我遇到了我不理解的 python 行为。

这是一个简单的演示代码:

l = []
def ext_and_return_l(ext):
    l.append(ext)
    return l

extensions = [1, 2, 3, 4]
gen = map(ext_and_return_l, extensions)

现在说我想看看我的发电机的条款,我有选择。

首先循环,给了我我的期望:

for i in gen:
    print(i)

 [1]
 [1, 2]
 [1, 2, 3]
 [1, 2, 3, 4]

使用 list 代替,再次运行演示代码后:

list(gen)

[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

我相信这与后期的函数闭包绑定有关,但我不了解这种情况下的确切机制,并希望在这里获得一些见解。

标签: pythonfunctionclosuresgenerator

解决方案


有一个全局列表l,每次调用都ext_and_return_l在修改同一个列表。你map用来懒惰地申请ext_and_return_lextensions事实并不重要。

您的循环所做的只是打印l不同时间的值(i只是一遍又一遍地重新绑定到同一个列表,而不是不同的列表)。为了更清楚地看到这一点,在循环中添加一行:

for i in gen:
    print(id(i))  # This will print the same value on each iteration.
    print(i)

推荐阅读