【问题标题】:Getting different results while executing similar "for loops"在执行类似的“for 循环”时得到不同的结果
【发布时间】:2023-01-11 13:44:54
【问题描述】:

代码 1

>>> L=[0,1,2,3]
    for i in range(len(L)):
        print(f"Counter {i}")
        for j in range(len(L)):
            print(j)
            if len(L)==4:
                L.remove(2)
                L.remove(3)
            else:
                pass

[Output] Counter 0
         0
         1
         2
         3
         Counter 1
         0
         1
         Counter 2
         0
         1
         Counter 3
         0
         1

代码 2

>>> L=[0,1,2,3]
    for i in L:
        print(f"Counter {i}")
        for j in L:
            print(j)
            if len(L)==4:
                L.remove(2)
                L.remove(3)
            else:
                pass

[Output] Counter 0
         0
         1
         Counter 1
         0
         1

这两个代码相似,但它们给出不同的结果。

在第一个代码中,L 的长度为 4,因此变量一世在第一个 for 循环中将取值 0、1、2 和 3。对于 i=0,j 再次可以取 4 个值。但是在第二个循环中,我们将列表的长度设为 2。因此,当 i=1 时,这种效果将反映出来,依此类推,从代码的输出中可以看出。

但是在第二个代码中,在第二次循环中删除了列表的两个元素后,其效果在第二次循环的下一次迭代中变得透明。

为什么会这样?我无法理解我们是否使用对于我在范围内(len(L))或者对于我在 L,其效果在2个代码的输出中应该是相同的。在第一个代码中,删除列表 range(L) 的两个元素后不会立即改变,而在第二个代码中我们得到不同的输出。

有人可以解释为什么会这样吗?

【问题讨论】:

  • for i in range(len(L)) -> for i in range(4) for i in L -> for i in [0,1,2,3]
  • 你的第一个代码是如何工作的 4 不在列表中,你正试图使用​​ .remove 从列表中删除,这会出错。
  • 非常抱歉。我已经编辑了代码。复制和粘贴代码时出现一些问题。

标签: python python-3.x loops for-loop data-structures


【解决方案1】:

这是因为对于第一个,您迭代了一个范围,这意味着您已经从一开始就计算了迭代次数 (4)。在第二个中,您遍历一个列表,这意味着它会一直循环直到用完列表中的项目。因为您在迭代期间从列表中删除了两个项目,所以它会更快地用完两个循环的项目。

在第一段代码中,range(len(L)) 会针对外循环的每次迭代重新计算,但这并不意味着外循环的 range(len(L)) 也会被重新计算。

【讨论】:

  • 谢谢回复。在第一个代码中,当 i=0 时,第二个循环开始,对于 j=0,列表的两个元素被删除,但是对于 i=0,范围 (L) 不会更改为范围 (2)。但是当i=1时,才在第二次循环中,range(L)变成了range(2)。
  • 但是在第二个代码中,在第二个循环中删除了for i=0这两个元素后,第二个for循环立即变成了“for j in [0,1]”。它应该改变为 i=1
  • 那是因为对于内部循环,您每次都在重新计算范围。
  • 是的,没关系。但是在第二个代码中,j 应该取值 0、1、2 和 3 然后我们可以看到我们必须重新评估第二个循环的下一个 i 值,只有这样 j 才应该取值 0 和 1,就像在第一个循环中发生的那样代码,不是吗?
  • Python 使用引用传递,因此代码中任何地方对 L 的任何修改都会导致它在其他地方也被修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多