循环和遍历列表

这是一个代码片段,它给出了输出: 0 1 2 2 。 我期望输出3 3 3 3因为a[-1]访问列表中的数字3。 在网上给出的解释说:“ a[-1]的价值在每次迭代改变”,但我不明白如何或为什么。 任何解释将是伟大的!

 a = [0, 1, 2, 3] for a[-1] in a: print(a[-1]) 

这里发生了什么是一个列表在循环过程中发生了变化。

让我们考虑下面的代码片段:

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

输出是:

 [0, 1, 2, 0] [0, 1, 2, 1] [0, 1, 2, 2] [0, 1, 2, 2] 

每次迭代:

  • 从当前由内部指针指向的位置读取值
  • 立即将其分配给列表中的最后一个元素
  • 之后,最后一个元素被打印在标准输出上

所以它是这样的:

  • 内部指针指向第一个元素,它是0,最后一个元素被该值覆盖; 列表是[0, 1, 2, 0] ; 打印值为0
  • 内部指针指向第二个元素,它是1,最后一个元素被该值覆盖; 列表是[0, 1, 2, 1] ; 打印值为1
  • (……)
  • 最后一步,内部指针指向最后一个元素; 最后一个元素被自己覆盖 – 列表在最后一次迭代中不会改变; 打印元素也不会改变。

for a[-1] in a ,实际上是遍历列表并暂时将当前元素的值存储到a[-1]

你可以看到这样的循环:

 a[-1] = a[0] # a = [0, 1, 2, 0] print(a[-1]) # 0 a[-1] = a[1] # a = [0, 1, 2, 1] print(a[-1]) # 1 a[-1] = a[2] # a = [0, 1, 2, 2] print(a[-1]) # 2 a[-1] = a[3] # a = [0, 1, 2, 2] print(a[-1]) # 2 

所以,当你在第三个元素上时, 2被存储到a[-1] (这个值是1 ,但之前为0 ,在开始时为3 )。

最后,当涉及到最后一个元素(和迭代结束)时,存储在a[-1]的最后一个值是2 ,这就解释了为什么要打印两次。