python - 生成器中的奇怪函数闭包行为
问题描述
我遇到了我不理解的 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]]
我相信这与后期的函数闭包绑定有关,但我不了解这种情况下的确切机制,并希望在这里获得一些见解。
解决方案
有一个全局列表l
,每次调用都ext_and_return_l
在修改同一个列表。你map
用来懒惰地申请ext_and_return_l
的extensions
事实并不重要。
您的循环所做的只是打印l
不同时间的值(i
只是一遍又一遍地重新绑定到同一个列表,而不是不同的列表)。为了更清楚地看到这一点,在循环中添加一行:
for i in gen:
print(id(i)) # This will print the same value on each iteration.
print(i)
推荐阅读
- powershell - Chocolatey ParamPackage 为空,即使该值是在调试模式下传递的
- swift - UIControl 中的 UICollectionView - 委托和数据源
- python - 查找给定颜色的像素的平均位置
- algorithm - 导出 nqueens 问题的时间复杂度
- vb.net - 设置默认属性失败,因为它是只读的?
- javascript - ExtJS 6.5 Ext.Form.field.Date 与 InputMask
- wireshark - 802.11 开放身份验证请求/响应帧的用途是什么
- apache-kafka - kafka领导人和Isr没有定义
- ios - 如何在另一个 VC2 的 `audioPlayerDidFinishPlaying()` 中重新加载 VC1 的 tableView 数据
- bash - 变量未在 bash 脚本的双引号中扩展