为什么我的简单程序永远不会退出我的while循环?

时间:2014-06-27 20:33:28

标签: python while-loop break

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

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循环。

3 个答案:

答案 0 :(得分: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!") 

答案 1 :(得分:1)

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

from random import randint

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

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

答案 2 :(得分:0)

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

在您的代码中,有两个名为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的确切位置和内容。

相关问题