【问题标题】:How do nested for loops work?嵌套的 for 循环如何工作?
【发布时间】:2016-05-10 10:14:28
【问题描述】:

这是我写的代码,运行良好:

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

for i in box:
    for x in box:
        print (i,x)

它输出以下内容:

1 1
1 2
1 3
1 4
1 5
2 1
2 2

等等

有趣的是:我得到了我想要的,但是我真的不明白其中的逻辑。对于我编写的代码,我希望得到以下输出:

1 1
2 2
3 3
4 4 
5 5 

为什么?因为根据我的想法,我陈述了以下内容:

对于框中的每个值 i(左列)和每个值 x(右列)都打印。

其实我认为代码应该是这样的:

for i,y in zip(box,box):
    print(i,y)

我的问题是,为什么函数中嵌套的 for 循环的行为与我预期的不同?

它是如何知道创建number * number 行的? 它是如何对数字进行排序的,那里究竟发生了什么关系?

【问题讨论】:

  • 为什么不应该它表现得那样?您的内循环针对外循环的每个步骤运行。所以对于i == 1,内部循环在j 上运行一个完整的循环。然后 i == 2 等再次相同。
  • 用笔和纸一步一步地完成它......
  • 或使用pythontutor.com/visualize.html#mode=edit 可视化代码流和执行
  • 谢谢你们,我已经检查了提供的链接 sp asic,我已经看到了可视化。现在它更有意义了:)谢谢:)

标签: python combinations


【解决方案1】:

这是逻辑。 for i in boxi 将开始为 1 并继续前进直到成为 5(列表中的所有元素)。所以如果你在这个循环中打印i,你会看到i首先是1,然后i2 ...直到i5(框中的最后一个元素)。 但是,如果您嵌套另一个 for 循环,则每次 i 是列表中的不同元素时,它都会执行相同的操作(从 1 开始并向前移动直到 5)。因此,当i1 时,在更改为另一个不同的i 之前,它将启动第二个循环(for x in box),因此当i1x 将更改为x = = 1, x == 2... x == 5。当这个嵌套循环完成时,i 会从列表中更改为另一个元素,所以现在i 将是2,并且嵌套循环再次开始,所以x == 1, x = = 2..., x == 5.

如果你尝试一下,我想你可能会理解它是如何工作的

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


for i in box: #it will go through all elements in the list
    print i, "this is the first loop" #for each different 'i' in box
    for x in box: #it will go through all elements in the list
        print x, "this is the second loop" #you will get all elements from the box
        print (i,x) #this is what you get

【讨论】:

    【解决方案2】:

    您的循环中有一个循环,因此该内部循环将在外部循环的每次迭代中完整运行。所以对于每个数量的 i,你需要遍历整个循环 for x。

    【讨论】:

      【解决方案3】:

      这个:

      box = [1, 2, 3, 4, 5]
      for i in box:
          for x in box:
              print (i,x)
      

      和这个是一样的:

      i = 1
      for x in box:
          print (i,x)
      i = 2
      for x in box:
          print (i,x)
      i = 3
      for x in box:
          print (i,x)
      i = 4
      for x in box:
          print (i,x)
      i = 5
      for x in box:
          print (i,x)
      

      【讨论】:

      • 是的,谢谢,我现在明白了。但是如果你尝试 for x in box,再次嵌套 for x in box,你会得到 1 1, 2 2
      • @michigansqllite123:是的,因为您在内循环中重新定义了x
      【解决方案4】:

      如果这是你想要的

      1 1 2 2 3 3 4 4 5 5

      然后这样做:

      for i in box: print(i,i)


      如果你这样做:

      for i in box: for x in box: print (i,x)

      那么外循环执行一次后,会执行内循环,直到内循环完成。这意味着对于 1 个外循环,内循环将执行 5 次。
      逻辑是这样的:

      • 我将检索 box 数组的第一个元素的值
      • x 将检索 box 数组的第一个元素的值
      • 然后将打印 1 1
      • x 将检索 box 数组的第二个元素的值
      • 然后将打印 1 2
      • x 将检索 box 数组的第三个元素的值
      • 然后将打印 1 3。以此类推,直到打印出 1 5
      • 我将检索 box 数组的第二个元素的值
      • x 将检索 box 数组的第一个元素的值
      • 然后将打印 2 1
      • x 将检索 box 数组的第二个元素的值
      • 然后将打印 2 2 等等

      【讨论】:

      • 不,这不是 OP 想要的。
      猜你喜欢
      • 2017-05-13
      • 2015-04-08
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多