Python3 无法识别代码中的变量

Python3 won't recognize a variable in code

提问人:Bark Jr. Jr. 提问时间:6/6/2017 更新时间:6/7/2017 访问量:2123

问:

我所有的代码都在下面。

这周刚开始学习编程。我正在尝试制作一个 Monty Hall 模拟器(仅限文本),玩家通过选择 1、2 或 3 来选择一扇门。但是,出于某种原因,Python 似乎无法识别输入!

以下是外行的游戏链接:

Monty Hall维基百科页面

Monty Hall 模拟

我的程序尝试执行的操作如下。首先,玩家选择一扇门,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()
Python 变量

评论


答:

3赞 cezar 6/6/2017 #1

在您的函数中:

def checkWin():
    if chosenDoor == winningDoor:
        print('You win!')
    if chosenDoor != winningDoor:
        print('You lose!')

您尝试比较 ,但它们尚未定义。该函数无法访问其他函数中的局部定义的变量。chosenDoorwinningDoorcheckWin()

您必须重构代码。最终,您可以为函数分配一些参数,并从其他函数返回一些值。checkWin

也:

# the rest of the code is the actual game

可以替换为:

if __name__ == "__main__":
    # your actual game

这是运行 Python 程序的标准方法。如果将此模块中的任何内容导入到另一个文件中,则代码不会意外运行。

编辑: 错误实际上是由这一行引起的:

while goatDoor == chosenDoor or goatDoor == winningDoor:

在函数中,定义 和 ,但未声明。doors()goatDoorwinningDoorchosenDoor

在函数中,您有同样的问题。keepOrSwitch()

然而,该函数也会导致错误。checkWin()

你也必须重构你的函数。它在语句后面有一个语句。它进入循环,并将完成函数调用,永远不会到达最后一行。chooseDoor()printreturnwhile

解决此问题的最简单方法是将返回值分配给变量:chooseDoor

choosenDoorByTheUser = chooseDoor()

然后调用其他函数,并将该变量作为参数。

3赞 Tomos Williams 6/7/2017 #2

你的变量超出了范围,你需要将你正在创建的变量存储在 while 循环中,并从你创建的方法中返回值,然后将这些值传递给 checkWin

keepOrSwitch应该返回chosen

chooseDoor应该返回chosenDoor

doors应该返回winningdoor/goatdoor

checkwin应该服用chosenDoor + winnindoor + goatdoor

然后,您将能够正确引用变量

3赞 cardamom 6/7/2017 #3

您已经发布了大量代码,这看起来像是范围问题,函数中的变量在其他函数中不可见。

解决此问题的快速而肮脏的方法是使导致错误的变量成为全局变量,如下所示:

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) + '.')

我认为这可能会解决它,但这不是好的编码实践。

1赞 Dorilds 6/7/2017 #4

在 python 程序中,您只在 chooseDoor() 函数中定义了 chosenDoor,并且没有将 chosenDoor 传递到下一个函数 doors()。您可以通过执行 doors(chosenDoor) 将 selectsenDoor 传递给 doors()。