【问题标题】:Negative index in python for loop [duplicate]python for循环中的负索引[重复]
【发布时间】:2015-09-16 10:41:18
【问题描述】:

我在谷歌搜索时发现了这个问题,但无法理解它是如何发生的?

a = [0, 1, 2, 3]

for a[-1] in a: 
    print(a[-1])

结果:

0 1 2 2

现在如果我再次打印:

 a
 [0, 1, 2, 2]

另一个类似的例子:

设 a 为原始列表,即 [0,1,2,3]

现在,让我们运行另一个 for 循环,但像这样:

for a[0] in a:
    print(a[0])

这次的结果是:

0 1 2 3

但再次打印:

[3,1,2,3]

所以,我有两个问题:

1) 在这两种情况下,原始列表是如何更新的?

2) 第一种情况下的结果解释是什么,即for循环为负数?

【问题讨论】:

  • 你为什么要这么做for a[0] in a?通常你会做for i in a 或类似的。你预计会发生什么?
  • 其实我是想循环一个列表,所以我这样做了,但很快意识到我的错误,并纠正了它,但后来我发现,我原来的列表已经改变了,就像上面提到的一样,所以我只是用打印语句重新运行代码,以检查发生了什么。还是不明白。
  • 像这样向后循环for i in a[::-1]
  • 或:for i in reversed(a):(这不会创建a的副本)。
  • @TimCastelijns 你为什么要为 a[0] 在 a 中这样做?一位面试官的兄弟问了我记得的那个问题,我想你为什么要问这个?大声笑:)

标签: python


【解决方案1】:

注意:a[-1] 指的是列表的最后一个元素。

你在每次循环迭代中分配给a[index]

for a[index] in a:

a[index] 将在循环期间被分配值 a[0], a[1], ..., a[-1] 并最终被分配给

a[index] = a[-1]

通常你尽量不要弄乱你正在迭代的列表:

for item in a:
    # do something with item

【讨论】:

    【解决方案2】:

    这是因为在 Python 中,这是:

    a = [0, 1, 2, 3]
    for i in a:
        ... statements ...
    

    可以这样理解:

    a = [0, 1, 2, 3]
    it = iter(a)
    i = next(it)
    ... statements ...
    i = next(it)
    ... statements ...
    i = next(it)
    ... statements ...
    i = next(it)
    ... statements ...
    

    现在,如果您将i 替换为a[index],那么您最终会将a[index] 替换为您迭代的最后一个元素,即列表中的最后一个元素。

    【讨论】:

      【解决方案3】:

      如果你重构为一个while循环,这有点直观

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

      变成

      a = [0, 1, 2, 3]
      while i < len(a):
        e = a[i]
        a[-1] = e    # the last element is constantly being overwritten
        print(a[-1]) # same as a[i]
      

      所以随着时间的推移a的值如下

      [0, 1, 2, 3] # original
      [0, 1, 2, 0] # prints 0
       |--------^
      [0, 1, 2, 1] # prints 1
          |-----^
      [0, 1, 2, 2] # prints 2
             |--^
      [0, 1, 2, 2] # prints 2
               |^
      

      第二种情况类似

      for a[0] in a:
          print(a[0])
      

      变成

      a = [0, 1, 2, 3]
      while i < len(a):
        e = a[i]
        a[0] = e    # the first element is constantly being overwritten
        print(a[0]) # same as a[i]
      

      而a的值为

      [0, 1, 2, 3] # original
      [0, 1, 2, 3] # prints 0
       ^|
      [1, 1, 2, 3] # prints 1
       ^--|
      [2, 1, 2, 2] # prints 2
       ^-----|
      [3, 1, 2, 3] # prints 3
       ^--------|
      

      【讨论】:

        猜你喜欢
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        相关资源
        最近更新 更多