为了账号安全,请及时绑定邮箱和手机立即绑定

生成器表达式使用生成器创建后分配的列表

生成器表达式使用生成器创建后分配的列表

肥皂起泡泡 2021-07-19 16:35:09
我找到了这个例子,但我不明白为什么它的工作不可预测?我认为它必须输出[1, 8, 15]或[2, 8, 22].array = [1, 8, 15]g = (x for x in array if array.count(x) > 0)array = [2, 8, 22]print(list(g))>>>[8]
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

从生成器表达式的文档:


当为生成器对象调用该方法时,生成器表达式中使用的变量会被延迟计算__next__()(与普通生成器的方式相同)。但是,最左边for子句中的可迭代表达式会立即求值,因此它产生的错误将在定义生成器表达式的位置发出,而不是在检索第一个值的位置发出。


所以当你跑


array = [1, 8, 15]

g = (x for x in array if array.count(x) > 0)

仅array计算生成器表达式中的第一个。x并且array.count(x)只会在您调用时进行评估next(g)。由于您在使用生成器之前array指向另一个列表[2, 8, 22] ,因此您会得到“意外”结果。


array = [2, 8, 22]

print(list(g))  # [8]


查看完整回答
反对 回复 2021-07-28
  • 3 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信