提问人:Bark Jr. Jr. 提问时间:6/6/2017 更新时间:6/7/2017 访问量:2123
Python3 无法识别代码中的变量
Python3 won't recognize a variable in code
问:
我所有的代码都在下面。
这周刚开始学习编程。我正在尝试制作一个 Monty Hall 模拟器(仅限文本),玩家通过选择 1、2 或 3 来选择一扇门。但是,出于某种原因,Python 似乎无法识别输入!
以下是外行的游戏链接:
我的程序尝试执行的操作如下。首先,玩家选择一扇门,1、2或3。然后程序会检查以确保玩家确实输入了这三个数字之一。如果没有,那么这个人需要再次选择。
在此之后,游戏随机选择一扇获胜的门。然后,根据游戏规则,程序需要显示一个虚拟奖品(山羊)。因此,程序随机选择其中一扇门作为“山羊门”。该程序首先确保这扇门不是获胜的门,也不是选择的门。
这是我在运行代码时遇到的错误:
line 52, in <module>
doors()
line 14, in doors
while goatDoor == chosenDoor or goatDoor == winningDoor:
NameError: name 'chosenDoor' is not defined
我的问题是我无法说出为什么它一直说 selectsenDoor 未定义!
代码如下:
import random
def chooseDoor(): # choose a door
chosenDoor = ''
while chosenDoor != 1 and chosenDoor != 2 and chosenDoor != 3:
print('Choose a door. (1, 2 or 3)')
chosenDoor = input()
return chosenDoor
print('You chose door number ' + str(chosenDoor) + '.')
def doors(): # the winning door and the dummy door are randomly selected
winningDoor = random.randint(1,3)
goatDoor = ''
while goatDoor == chosenDoor or goatDoor == winningDoor:
goatDoor = random.randint(1, 3)
def keepOrSwitch():
switchDoor = 1
if switchDoor == chosenDoor or switchDoor == winningDoor:
switchDoor = 2
if switchDoor == chosenDoor or switchDoor == winningDoor:
switchDoor = 3
print('Do you want to')
print('KEEP your choice of door number ' + str(chosenDoor) + '?')
print('...or...')
print('Do you want to')
print('SWITCH and choose door number ' + str(switchDoor) + '?')
print()
choice = ''
while True:
print('Type \'K\' for keep or type \'S\' for switch.')
choice = input()
if choice == 'K' or choice == 'k':
break
if choice == 'S' or choice == 's':
chosenDoor = switchDoor
break
def checkWin():
if chosenDoor == winningDoor:
print('You win!')
if chosenDoor != winningDoor:
print('You lose!')
# the rest of the code is the actual game
playAgain = 'yes'
while playAgain == 'yes' or playAgain == 'y':
chooseDoor()
doors()
keepOrSwitch()
checkWin()
print('Do you want to play again? (yes or no)')
playAgain = input()
答:
在您的函数中:
def checkWin():
if chosenDoor == winningDoor:
print('You win!')
if chosenDoor != winningDoor:
print('You lose!')
您尝试比较 ,但它们尚未定义。该函数无法访问其他函数中的局部定义的变量。chosenDoor
winningDoor
checkWin()
您必须重构代码。最终,您可以为函数分配一些参数,并从其他函数返回一些值。checkWin
也:
# the rest of the code is the actual game
可以替换为:
if __name__ == "__main__":
# your actual game
这是运行 Python 程序的标准方法。如果将此模块中的任何内容导入到另一个文件中,则代码不会意外运行。
编辑: 错误实际上是由这一行引起的:
while goatDoor == chosenDoor or goatDoor == winningDoor:
在函数中,定义 和 ,但未声明。doors()
goatDoor
winningDoor
chosenDoor
在函数中,您有同样的问题。keepOrSwitch()
然而,该函数也会导致错误。checkWin()
你也必须重构你的函数。它在语句后面有一个语句。它进入循环,并将完成函数调用,永远不会到达最后一行。chooseDoor()
print
return
while
解决此问题的最简单方法是将返回值分配给变量:chooseDoor
choosenDoorByTheUser = chooseDoor()
然后调用其他函数,并将该变量作为参数。
你的变量超出了范围,你需要将你正在创建的变量存储在 while 循环中,并从你创建的方法中返回值,然后将这些值传递给 checkWin
keepOrSwitch
应该返回chosen
chooseDoor
应该返回chosenDoor
doors
应该返回winningdoor
/goatdoor
checkwin
应该服用chosenDoor
+ winnindoor
+ goatdoor
然后,您将能够正确引用变量
您已经发布了大量代码,这看起来像是范围问题,函数中的变量在其他函数中不可见。
解决此问题的快速而肮脏的方法是使导致错误的变量成为全局变量,如下所示:
def chooseDoor(): # choose a door
global chosenDoor = ''
while chosenDoor != 1 and chosenDoor != 2 and chosenDoor != 3:
print('Choose a door. (1, 2 or 3)')
chosenDoor = input()
return chosenDoor
print('You chose door number ' + str(chosenDoor) + '.')
我认为这可能会解决它,但这不是好的编码实践。
在 python 程序中,您只在 chooseDoor() 函数中定义了 chosenDoor,并且没有将 chosenDoor 传递到下一个函数 doors()。您可以通过执行 doors(chosenDoor) 将 selectsenDoor 传递给 doors()。
评论