举个例子:
>>> for item in [i * 2 for i in range(1, 10)]:
print item
2
4
6
8
10
12
14
16
18
[i * 2 for i in range(1, 10)]
是每次通过循环计算,还是只计算一次并存储? (另外,表达式的那部分的正确名称是什么?)
我想要这样做的一个原因是我只希望该列表理解的结果在循环中可用。
最佳答案
很好的翻译for i in <whatever>: <loopbody>
, 显示它对 any 的作用 <whatever>
和任何 <loopbody>
:
_aux = iter(<whatever>)
while True:
try: i = next(_aux)
except StopIteration: break
<loopbody>
除了我在这里命名的伪变量_aux
实际上仍未命名。
所以,<whatever>
总是只被评估一次(从中得到一个 iter()
)并且生成的迭代器是 next
ed 直到用完(除非 break
中有一些 <loopbody>
)。
如您所用,使用 listcomp,计算会产生 list
对象(在您的代码示例中仍未命名)。在非常相似的代码中:
for item in (i * 2 for i in range(1, 10)): ...
使用 genexp 而不是 listcomp(语法上,圆括号而不是 listcomp 的方括号),它是 next()
这实际上完成了大部分工作(推进 i
并将其加倍),而不是在构建时集中所有工作——这占用较少的临时内存,并且如果循环体很可能会节省时间 break
尽早退出,但除非在这种特殊情况下(非常紧张的内存或可能提前循环终止)listcomp 通常可能会(一点点)更快。
关于Python:如果迭代器是一个表达式,是否每次都计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137443/