我找到了这个例子,但我不明白为什么它的工作不可预测?我认为它必须输出[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]
添加回答
举报
0/150
提交
取消