为什么我的python程序没有关闭

时间:2014-10-20 19:04:02

标签: python while-loop

如果用户没有输入yes,y,no或n

,我希望此代码停止循环该函数
go = True
def levelOne():
    print "You are in a room"
    print "There is a table, on the table there is a key"
    print "There is a door to the north"
    print "Use the key to open the door and escape?"
    userInput = raw_input()
    str(raw_input).lower()
    if userInput == "y" or userInput == "yes":
        print "Ok"
    elif userInput == "n" or userInput == "no":
        print "Fine, die then"
    else:
        go = False
While go == True:
    levelOne()

现在它无限循环,为什么会这样?

2 个答案:

答案 0 :(得分:5)

问题是levelOne没有修改全局变量go,它正在创建一个具有相同名称的新本地变量,该变量一旦消失就会消失函数返回。*

修复方法是将global go添加到函数定义的顶部。

话虽如此,使用全局变量几乎不是最好的解决方案。为什么不只是拥有这个功能,例如return Truereturn False,所以你可以写while levelOne(): pass


我们在谈论时会发表一些旁注:

  • 最好是(a)学习如何使用调试器,或者(b)习惯在每个中间步骤之后添加print语句。在试图弄清楚出了什么问题时,要知道出现问题的地方比试图查看整个大画面视图并猜测可能存在错误的位置更有帮助。
  • str(raw_input)正试图在str函数本身上调用raw_input,这意味着它会为您提供类似'<built-in function raw_input>'的内容。您想在raw_input结果上调用它。您存储在名为userInput
  • 的变量中 无论如何,
  • strraw_input的结果毫无用处。它保证是一个字符串,所以为什么要尝试将它转换为字符串?
  • 只需在某些内容上调用str,然后在结果上调用lower,然后忽略它返回的内容,就无效了。这些函数都没有修改它的输入,它们只返回一个 new 值,如果你想从中获得任何好处,你必须将它用作参数或存储在变量中。
  • if go == True:几乎从不有用。如果您只想检查go是否真实,请使用if go:。如果你真的想确保它完全是单身常量True,而不是其他任何真相,请使用is True。 (1 == True,但1 is not True,以及其他原因。)

*在Python中,无论何时指定名称,总是创建或重新绑定局部变量 - 除非您明确告知它,否则使用global(或nonlocal)语句,在这种情况下,它会创建或重新绑定全局(或非局部闭包)变量。

答案 1 :(得分:1)

虽然批评您的代码有很多,但以下内容应该按照您的意图运行:

 def levelOne():
     print "You are in a room"
     print "There is a table, on the table there is a key"
     print "There is a door to the north"
     print "Use the key to open the door and escape?"
     userInput = raw_input()
     userInput = str(userInput).lower()
     if userInput in ("y", "yes"):
         print "Ok"
     elif userInput in ("n", "no"):
         print "Fine, die then"
     else:
         return False
     return True


 while levelOne():
     pass