【问题标题】:Why does the i in second loop counts as 1 less than the given input by the user?为什么第二个循环中的 i 比用户给定的输入少 1?
【发布时间】:2019-04-21 22:10:33
【问题描述】:

由于某种原因,循环中的第二个 i 比用户给定的输入少 1。我不知道 i 在哪里改变它的值

我试图解决它的一种方法是改变

对于范围内的 i (int(i))

对于范围内的 i (int(i)+1)

确实解决了问题,但不知道为什么需要它

i = input()
AliceShapeSequence = []
BobShapeSequence = []

for i in range (int(i)):
        AliceShape = input()
        AliceShapeSequence.append(AliceShape)
    
for i in range (int(i)):
        BobShape = input()
        BobShapeSequence.append(BobShape)
    
print(AliceShapeSequence)
print(BobShapeSequence)

两个列表都有 3 个值,但 AliceShapeSequence 有 3 个,BobShapeSequence 有 2 个(取决于我在本例中使用的输入 3)

【问题讨论】:

  • 您最近删除的另一个问题的答案:stackoverflow.com/questions/60684/…
  • 哦,谢谢你:)。实际上我刚刚在另一篇文章中找到了解决方案,所以我删除了我的问题。

标签: python python-3.x


【解决方案1】:

这实际上是一个非常有趣的问题。让我们逐步了解这里发生的事情。

i = input()

假设您的用户输入了3。现在i3,正如预期的那样。

for i in range (int(i)):

首先,range(int(i)) 被调用。 Python 的range,当使用一个参数调用时,会创建一个从0(包括)到该参数(不包括)的范围。由于i3,这将创建一个包含值012 的范围。

现在,您开始迭代,迭代变量i.i 首先设置为0,然后运行代码块1,然后运行代码块,然后运行2 ,代码块最后一次运行。

但是,有一个技巧。由于 Python 的作用域规则,您的迭代变量 i 实际上与全局变量 isame 变量。因此,在迭代期间,您将 global i 值更新为 0,然后是 1,然后是 2。所以当我们开始下一个循环时:

for i in range (int(i)):

range(int(i))range(2),它创建了一个包含元素 01 的范围——这不是你想要的。

要解决此问题,请将迭代变量更改为其他内容 - 可能是 j,正如另一个答案所建议的那样。

【讨论】:

    【解决方案2】:

    for 循环中的 i 每次运行时都会更新。

    range(5) // gives you 0-4
    

    i 在循环的最后一个循环中设置为 4。使用不同的变量名。

    【讨论】:

      【解决方案3】:

      变量i是全局的,在这个模块中定义的任何python函数或类都可以访问这个变量:

      你的键值和你的输入变量在同一个scope

      所以你输入3,循环从0开始计数,直到循环i在第一个循环之后计数到2,所以循环将从2开始:

      i = input()
      AliceShapeSequence = []
      BobShapeSequence = []
      
      for x in range (int(i)):
              AliceShape = input()
              AliceShapeSequence.append(AliceShape)
      
      for x in range (int(i)):
              BobShape = input()
              BobShapeSequence.append(BobShape)
      
      print(AliceShapeSequence)
      print(BobShapeSequence)
      

      只需将递增键更改为其他变量名即可。

      为了便于理解,只需运行:

      i = 3
      AliceShapeSequence = []
      BobShapeSequence = []
      
      for i in range (int(i)):
              AliceShape = i
              AliceShapeSequence.append(AliceShape)
              print("first loop: i = {0} after {1} loop cycle".format(i, i+1))
      
      for i in range (int(i)):
              BobShape = i
              BobShapeSequence.append(BobShape)
              print("second loop: i = {0} after {1} loop cycle".format(i, i+1))
      
      
      print(AliceShapeSequence)
      print(BobShapeSequence)
      

      【讨论】:

        【解决方案4】:

        我运行了您的代码,但在两种情况下都将for i in range(int(i)) 更改为for j in range(int(i)),然后它的行为符合预期。

        您不应该使用相同的变量名称,否则您可能会遇到意外副作用的问题。

        【讨论】:

          猜你喜欢
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 2012-08-25
          • 2016-04-23
          • 2017-05-17
          • 1970-01-01
          • 2020-10-30
          相关资源
          最近更新 更多