【发布时间】:2017-07-28 00:38:37
【问题描述】:
我知道我不应该在循环中修改列表,但出于好奇,我想知道为什么以下两个示例的迭代次数不同。
示例 1:
x = [1, 2, 3, 4, 5]
for i, s in enumerate(x):
del x[0]
print(i, s, x)
示例 2:
x = [1,2,3,4,5]
for i, s in enumerate(x):
x = [1]
print(i, s, x)
示例 1 只运行了 3 次,因为当 i==3、len(x)==2 时。
示例 2 运行 5 次,即使 len(x)==1。
所以我的问题是,enumerate 是否会在循环开始时生成 (index, value) 对的完整列表并遍历它?或者它们是在循环的每次迭代中生成的?
【问题讨论】:
-
我不能假装我知道的足以回答你的问题,但至于为什么它的行为不同,这是我的猜测。在第一种情况下,您将从同一个列表中删除,因此迭代之前停止是有意义的。但是,在第二种情况下,您正在重新分配它。所以python可能认为它是一个
different变量并继续使用x的original值。 -
完全没有枚举也会发生同样的情况!
for循环不会重新评估迭代器,因此即使您在for循环内重新分配x,循环仍将使用旧值。显然,如果您从列表中删除元素,循环将以更少的迭代完成。 -
这一定是骗人的。
-
enumerate 需要适用于未绑定的序列,因此无法预先生成对。如果你想,只需使用
list(enumerate(...)) -
@jpmc26 确实有 stackoverflow.com/a/986145/3451198 我昨天没有找到。它确实很好地解释了潜在问题,但不是在循环的上下文中。这应该被标记吗?我是 SO 的新手,不确定。
标签: python list loops iterator enumerate