【问题标题】:Why does my simple program never exit my while loop?为什么我的简单程序永远不会退出我的 while 循环?
【发布时间】:2014-07-01 01:02:50
【问题描述】:

这是一个简单的猜数字游戏,代码如下:

from random import randint

number = randint(0,20)
playerGuess = '0'
def guess():
    playerGuess = input("Guess a number:  ")

    if int(playerGuess) == number:
        print("Correct!")

    elif int(playerGuess) > number:
        print("Lower!")

    elif int(playerGuess) < number:
        print("Higher!")

    else:
        print("Please input a whole number.")

while int(playerGuess) != number:
    guess()

print("------------------------------------")
print("Good job!") 

我不明白为什么代码没有按预期跳出 while 循环。

【问题讨论】:

  • @TankorSmash:它可能显示正确,但它永远不会跳出循环,它只会一遍又一遍地询问。当您猜对时,它也不会改变数字。

标签: python while-loop break


【解决方案1】:

guess 不会更改 playerGuess = '0' 的全局值 要做到这一点,您需要使用 global 指定,尽管有更好的方法来重构您的代码:

from random import randint

number = randint(0,20)
playerGuess = '0'
def guess():
    global playerGuess #Emphasis on this line.
    playerGuess = input("Guess a number:  ")

    if int(playerGuess) == number:
        print("Correct!")

    elif int(playerGuess) > number:
        print("Lower!")

    elif int(playerGuess) < number:
        print("Higher!")

    else:
        print("Please input a whole number.")

while int(playerGuess) != number:
    guess()

print("------------------------------------")
print("Good job!") 

【讨论】:

    【解决方案2】:

    因为guess()函数中的playerGuess与文件顶部的playerGuess不是同一个变量。在guess() 函数中使用global playerGuess

    from random import randint
    
    number = randint(0,20)
    playerGuess = '0'
    def guess():
        global playerGuess
        ...
    

    提示和技巧:全局变量不好,尝试在没有全局变量的情况下重写代码。

    【讨论】:

      【解决方案3】:

      变量只存在于它们的“命名空间”中,这是识别不同变量的代码部分。为您编写的每个函数创建一个新的命名空间。这很有帮助,因为随着项目的增长,您可能希望将公共变量名称重用于多个不同的事物。

      在您的代码中,有两个不同的变量名为playerGuess。一个在第一个命名空间中,一个在您为函数 guess() 创建的命名空间中。如果我们这样写代码:

      while int(playerGuess) != number:
          print(playerGuess, number)           # The added line
          guess()
      

      它变得更加清晰。这是我玩的游戏,加了一行:

      0 14
      Guess a number:
      >>> 10
      0 14     # playerGuess is still 0, not 10
      Higher!
      Guess a number:  
      >>> 14
      0 14     # I've been told I won because that happens in the guess() function
      Correct!
      Guess a number:  # But the while: loop doesn't know I've won
      . . .
      

      脚本中任何函数之外的命名空间(例如number = randint(0,20) 所在的位置)是“全局”命名空间,这意味着可以从任何其他命名空间中提取值。这就是为什么number 可以被guess() 函数使用的原因——guess() 检查是否在其命名空间中定义了变量number,发现没有,然后检查全局命名空间。可以从代码的其他部分更改全局命名空间,但这被认为是不好的做法,因为这些更改的来源可能并不明显。如果你想采用这种方法,你可以像这样改变你的代码:

      from random import randint
      
      number = randint(0,20)
      playerGuess = '0'
      def guess():
          global playerGuess                  # The added line
          playerGuess = input("Guess a number:  ")
      . . .
      

      现在它可以工作了,因为guess() 已被明确授予更改全局命名空间的权限。另一种方法是只在命名空间之间来回传递我们关心的值。

      from random import randint
      number = randint(0,20)
      playerGuess = '0'
      def guess():
          playerGuess = input("Guess a number:  ")
      
          if int(playerGuess) == number:
              print("Correct!")
      
          elif int(playerGuess) > number:
              print("Lower!")
      
          elif int(playerGuess) < number:
              print("Higher!")
      
          else:
              print("Please input a whole number.")
      
          return playerGuess                     # Added line
      
      while int(playerGuess) != number:
          print(playerGuess, number)
          playerGuess = guess() # Added line, update the playerGuess in this namespace
      

      这被认为更好,因为现在很明显改变变量 playerGuess 的确切位置和内容。

      【讨论】:

        猜你喜欢
        • 2018-08-14
        • 2018-10-12
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 2015-02-24
        相关资源
        最近更新 更多