【问题标题】:for loops and iterating through listsfor 循环和遍历列表
【发布时间】:2016-04-14 05:27:32
【问题描述】:

这是一段代码,它给出了输出: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])

【问题讨论】:

  • 我从未见过这样的事情;我很想阅读文章/教程/任何显示此示例的内容,您能否发布指向它的链接?
  • 另外,恭喜您提出第一个问题! (恢复了对新 SO 用户的信心)
  • 好问题。为什么a[-1] 甚至被允许作为循环变量...
  • 我见过的最有趣的for循环。

标签: python for-loop indexing


【解决方案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,这就解释了为什么它会被打印两次。

【讨论】:

    【解决方案2】:

    这里发生的是一个列表在循环过程中发生了变异。

    让我们考虑以下代码sn-p:

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

    【讨论】:

      【解决方案3】:

      这段代码

      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, range(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
      • 第 4 次循环,当前列表 = [0, 1, 2, 2],i = 3 => a[i] = a[3] = 2,更新列表 = [0, 1, 2, 2],最后元素 a[-1] = 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 2019-09-07
        • 2021-04-01
        • 2016-02-05
        • 2023-01-24
        相关资源
        最近更新 更多