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