在Python中,“for a[-1] in a”和“for a in a”的区别是什么?

5
在这个帖子中,以下代码片段可以使用。
a = [0, 1, 2, 3]
for a[-1] in a:
    print(a[-1])

请参考此答案

在执行 for a[-1] in a 时,实际上是遍历整个列表并将当前元素的值临时存储到 a[-1] 中。

同样地,我认为执行 for a in a 时,应该遍历整个列表并将当前元素的值临时存储到 a 中,因此 a 的值可能是 0,无法进行迭代,接下来的迭代会抛出 TypeError 异常。然而,结果如下所示。

>>> a = [0, 1, 2, 3]
>>> for a in a:
...     print a
... 
0
1
2
3
>>> a
3

如何理解IT技术?

1个回答

6
引用for循环的官方文档,对表达式列表的结果创建了一个迭代器iterator。然后按照索引升序的顺序为每个由迭代器提供的项执行一次suite。
因此,在迭代对象时,会创建一个迭代器对象并用于迭代。这就是为什么原始对象至少在循环运行时不会丢失。
在您的情况下,当执行for a in a:时,首先为a创建一个迭代器对象,并从迭代器对象中检索值。即使循环将名称a绑定到每次迭代中的其他值,迭代器对象仍保留对原始列表对象的引用,并从中输出值。这就是为什么你没有得到任何错误的原因。

那么 a[-1] 可以改变 迭代器对象 吗? - zangw
@zangw 它不会改变迭代器对象,它实际上是改变列表对象中的值。当迭代器到达最后一个元素时,它只是返回列表中最后一个位置上的任何内容。 - thefourtheye
由于迭代器对象是在for循环中创建的,所以a[-1]会改变原始对象,但是for a in a:只会改变迭代器对象 - zangw
@zangw 在 for 循环开始之前,迭代器对象将被创建。基本上 for a in a: 实际上是 for a in iter(a):。因此,在每次迭代中,从迭代器中检索的值都绑定到 a 上。 - thefourtheye
1
当我说“绑定”时,可以将其视为赋值操作。因此,在每次迭代中,都会检索一个迭代器的值并存储在a中。但这只是使a具有不同的值,指向a的原始列表对象仍将保留在内存中,因为迭代器对象仍在使用它。 - thefourtheye
@zangw 没问题 :-) 由于英语不是我的母语,我可能无法正确表达我的意思。感谢您容忍我的英语 :-) - thefourtheye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接