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

我找到了这个例子,但我不明白为什么它的工作不可预测?我认为它必须输出[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]


肥皂起泡泡
浏览 155回答 3
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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python