【问题标题】:Python3 won't recognize a variable in codePython3 无法识别代码中的变量
【发布时间】:2017-06-06 15:51:38
【问题描述】:

我所有的代码都在下面。

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

以下是游戏的链接,适合初学者:

Monty Hall wikipedia page

Monty Hall simulation

我的程序试图做的事情如下。首先玩家选择一扇门,1、2 或 3。然后程序检查以确保玩家确实输入了这三个数字之一。如果不是,则该人需要再次选择。

在此之后,游戏随机选择一个获胜门。然后,根据游戏规则,程序需要显示一个虚拟奖品(山羊)。所以程序随机选择其中一扇门作为“山羊门”。程序首先确定这扇门不是获胜门,也不是被选中的门。

这是我在运行代码时遇到的错误:

line 52, in <module>

     doors()

line 14, in doors

     while goatDoor == chosenDoor or goatDoor == winningDoor:

NameError: name 'chosenDoor' is not defined

我的问题是我不知道为什么它一直说 selectedDoor 没有定义!

代码如下:

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 variables


    【解决方案1】:

    在你的函数中:

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

    您尝试将chosenDoorwinningDoor 进行比较,但它们尚未定义。函数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() 中,您定义了 goatDoorwinningDoor,但未声明 chosenDoor

    在函数keepOrSwitch() 中你也有同样的问题。

    尽管如此,函数checkWin() 也会导致错误。

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

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

    choosenDoorByTheUser = chooseDoor()
    

    然后以该变量作为参数调用其他函数。

    【讨论】:

      【解决方案2】:

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

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

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

      我认为这可能会解决它,但它不是一个好的编码习惯。

      【讨论】:

        【解决方案3】:

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

        keepOrSwitch 应该返回 chosen

        chooseDoor 应该返回 chosenDoor

        doors 应该返回 winningdoor/goatdoor

        checkwin 应该是chosenDoor + winnindoor + goatdoor

        然后你就可以正确引用你的变量了

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-21
            • 2021-01-06
            • 1970-01-01
            相关资源
            最近更新 更多