这是一个简单的数字猜谜游戏,代码如下:
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循环。
答案 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的确切位置和内容。