【发布时间】:2020-03-06 14:52:50
【问题描述】:
我遇到了一个我不理解的 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(gen)
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
我认为这与函数闭包绑定较晚有关,但我不了解这种情况下的确切机制,希望能在这里得到一些见解。
【问题讨论】:
-
这不是一个闭包,真的,只是
l是一个全局变量,所以每次调用ext_and_return_l都会修改同一个列表。 -
如果你需要你期望的迭代器,使用
list.copy,例如:def yield_list_copy(gen): """ >>> assert list(yield_list_copy(mk_gen())) == [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]""" for i in gen: yield i.copy()
标签: python function closures generator