请教一个关于生成器表达式的问题

2017-07-31 20:36:17 +08:00
 saximi
iters = list(map(iter, ('ab','12')))
while iters:
try:
res = [next(i) for i in iters] #语句 1
print("res=",res)
except StopIteration:
print("OVER")
break

上面这段程序输出如下:
res= ['a', '1']
res= ['b', '2']
OVER

但是把语句 1 中方括号变成圆括号后,语句 1 变成:“ res = (next(i) for i in iters)”,此时输出是如下两条信息的反复循环:
res= at 0x020881E0>
res= at 0x02088480>
...

我的问题是:
为何语句 1 中方括号变成圆括号,res 此时变成了生成器表达式后,会导致输出无限循环?

请大家指点,感谢!
1941 次点击
所在节点    Python
4 条回复
glasslion
2017-07-31 22:01:55 +08:00
生成器表达式是惰性的,你不去遍历它, next(i) 就不会被实际执行, 就不会触发 StopIteration, 结束循环
Pysensor
2017-07-31 22:04:16 +08:00
拙见。。。其实不管你的 res 是不是改成生成器表达式,你给 res 赋任意一个值,都会是无限循环的,这就差不多是 while True: print(res)
wisej
2017-07-31 22:08:09 +08:00
res = [next(i) for i in iters] 会执行 next(i).
然而,当你将方括号变成圆括号后,python 解释器执行到语句 1 的时候,只会生成一个 generator object (里面包含了生成器表达式所在行等信息) ,同时 res 指向它。但是,这个 generator 并不会被执行,也就意味着无论是 iter 还是 i 都不会触发 StopIteration.最后的结果就是无限循环了
saximi
2017-07-31 22:59:18 +08:00
感谢大家指点!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/379364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX