Python中'for a[-1] in a'和'for a in a'之间的区别?

zan*_*ngw 5 python for-loop python-internals

在这篇文章中,以下代码片段可以工作。

a = [0, 1, 2, 3]
for a[-1] in a:
    print(a[-1])
Run Code Online (Sandbox Code Playgroud)

参考这个答案

这样做时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
Run Code Online (Sandbox Code Playgroud)

怎么理解?

the*_*eye 5

引用有关forloop官方文档

为 expression_list 的结果创建一个迭代器。然后按照索引升序对迭代器提供的每个项目执行一次套件。

因此,当您迭代一个对象时,会创建一个迭代器对象并用于迭代。这就是为什么原始对象不会丢失的原因,至少在循环运行之前是这样。

在您的情况下,当for a in a:执行时,a首先创建一个迭代器对象,并从迭代器对象中检索值。即使循环a在每次迭代时将名称绑定到某个其他值,迭代器对象仍然持有对原始列表对象的引用,并从中给出值。这就是为什么你没有收到任何错误。