for循环和迭代列表

时间:2016-01-09 15:49:32

标签: python for-loop indexing

以下是一段代码,其中提供了输出:0 1 2 2。由于3 3 3 3访问列表中的数字3,我原本期望输出a[-1]。在线解释说" a[-1]的值在每次迭代中发生变化"但我不太明白如何或为什么。任何解释都会很棒!

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

3 个答案:

答案 0 :(得分:34)

在执行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,但之前为03开始时。)

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

答案 1 :(得分:15)

这里发生的是列表在循环期间发生变异。

让我们考虑以下代码段:

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
  • (...)
  • 最后一步,内部指针指向最后一个元素;最后一个元素被自己覆盖 - 列表在最后一次迭代时不会改变;印刷元素也不会改变。

答案 2 :(得分:0)

此代码

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

等同于

a = [0, 1, 2, 3]
for i in range( len(a) ):
    a[-1] = a[i] # update last element of list(updated) with element at i'th position
    print(a[-1]) # print last element of list

输出将为0 1 2 2

说明:

len(a)= 4,范围(len(a))= [0,1,2,3]

  • 第一个循环,当前列表= [0,1,2,3],i = 0 => a [i] = a [0] = 0,更新的列表= [0,1,2,0],最后一个元素 a [-1] = 0
  • 第二个循环,当前列表= [0,1,2,0],i = 1 => a [i] = a [1] = 1,更新后的列表= [0,1,2,1],最后一个元素 a [-1] = 1
  • 第三个循环,当前列表= [0,1,2,1],i = 2 => a [i] = a [2] = 2,更新的列表= [0,1,2,2],最后一个元素 a [-1] = 2
  • 第四个循环,当前列表= [0,1,2,2],i = 3 => a [i] = a [3] = 2,更新后的列表= [0,1,2,2],最后一个元素 a [-1] = 2