Python 是否缓存 for 循环可迭代?

Does Python cache the for loop iterable?

我想知道 Python 中的 for 循环是如何处理可迭代对象的。对于存在于内存中的固定可迭代对象,Python 简单地用循环对其进行迭代,例如:

x=[1,2,3,4,5]

for i in x:
    print(i)

但是假设我们使用函数生成可迭代对象,例如:

for i in sorted(x):
    print(i)

在这种情况下,可迭代对象是否是第一次计算然后缓存以供后续迭代使用?还是每次迭代都重新计算?

当然,后者看起来确实效率很低,所以它可能是以前一种方式实现的。但是,我找不到任何文档来支持这种说法,所以如果有人可以分享它,那就太棒了!

试试下面的代码:

x = [1 for _ in range(10)]
for i in range(len(x)):
 print(x)
 x = [5]

如您所见,输出为:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[5]
[5]
[5]
[5]
[5]
[5]
[5]
[5]
[5]

也就是说,range(len(x))只计算一次,而且是缓存的,不是每次都计算。 希望有所帮助

x = [1, 2, 3, 4, 5]
for i in sorted(x):
    print(i)

等同于:

x = [1, 2, 3, 4, 5]
y = sorted(x)
for i in y:
    print(i)

sorted(x) 只计算一次,而不是 for 循环的每次迭代。函数 returns 一个数组,然后通过 for 循环对其进行迭代。