【问题标题】:Why is Python for loop not looping with a while loop inside为什么 Python for 循环没有循环,里面有一个 while 循环
【发布时间】:2020-03-21 02:35:46
【问题描述】:

我真的很好奇这个。

我有一个循环遍历列表的 for 循环。在 for 循环中,我有一个 while 循环,我想循环直到满足条件。当while循环的条件满足时,停止while循环,移动到list的下一项,重新开始while循环。

示例代码如下:

course_ids = [1,2,3,4,5]

loop_control = 0
counter = 0

for ids in course_ids:
    while loop_control == 0:
        counter = counter + 1
        if counter == 2:
            loop_control = 1

问题是当while循环条件满足时,就完全跳出for循环了。

如何让 for 循环在其中使用 while 循环按预期工作?

【问题讨论】:

  • 是什么让你认为它也跳出了 for 循环?确实,当 while 循环的条件不满足时(loop_control == 1),对于每个后续的 for 循环迭代,情况仍然如此。从技术上讲,for 循环仍在继续,迭代并没有做太多。
  • 事实上,您的while 结构将循环两次。在第一次迭代中,counter 将被设置为 1,在第二次迭代中,它将被设置为 2if counter==2 语句随后将变为有效。此时loop_control 将设置为1。在随后的循环尝试中,表达式loop_control==0 将计算为Falsewhile 循环将失败。 for 循环的第二次迭代将继续进行。 while 循环的任何后续迭代都将失败,因为 loop_control 仍将等于 1
  • 如果你想在每次for循环迭代之后重复while,你需要在@987654342之前将loop_control(可能还有counter)重置为0 @,而不是在for 之前。
  • 不错。谢谢你做到了。我添加了这个python if counter != len(course_ids): loop_control = 0

标签: python list while-loop


【解决方案1】:

您在 if 语句中将循环控制设置为 1。 while 循环设置为仅在循环控制等于 1 时运行。所以基本上第一次运行时,您将条件设置为不再运行。

如果您在 for 循环的每次迭代中将循环控制重置为零,则每次都会运行 while。

course_ids = [1,2,3,4,5]

# loop_control = 0 <-- Remove this line
counter = 0

for ids in course_ids:
    loop_control = 0 # place this line and see it work more than once.
    while loop_control == 0:
        counter = counter + 1
        if counter == 2:
            loop_control = 1

【讨论】:

    【解决方案2】:

    你的假设是错误的,它完全脱离了 for 循环。它不会,它会运行,但 while 条件永远不会是 True,因此它永远不会在其中运行。

    您还可以通过在 for 循环中添加 print 语句并查看其输出来检查这一点。

    course_ids = [1,2,3,4,5]
    
    loop_control = 0
    counter = 0
    
    for ids in course_ids:
        print("here")
        while loop_control == 0:
            counter = counter + 1
            if counter == 2:
                loop_control = 1
    

    输出:

    here
    here
    here
    here
    here
    

    如您所见,它按预期运行了 5 次。您还应该考虑将代码可视化以获得更好的理解,请参阅here

    【讨论】:

      【解决方案3】:

      你们都是对的。

      我没有重置while循环条件

      我在 for 循环之后添加了这些行,它解决了问题

      if counter != len(course_ids):
          loop_control = 0
      

      【讨论】:

        猜你喜欢
        • 2019-01-13
        • 2020-03-07
        • 1970-01-01
        • 2019-07-03
        • 2019-09-16
        • 2012-09-19
        • 1970-01-01
        • 2012-10-20
        • 2011-04-01
        相关资源
        最近更新 更多