变量不会分配给 Python 中的输入

Variable won't be assigned to input in Python

我是编程新手,正在阅读这本书 "Invent Your Own Computer Games with Python"。为了测试我是否理解这些章节,我尝试重做该章节一直在做的任何游戏并添加修饰,而不是参考文本寻求帮助。我对某个部分的编程与书中的不同,但我不明白为什么它不起作用。

def chooseletter():
    loop = True
    playerletter = ""
    computerletter = ""
    while playerletter not in "X O".split():
        playerletter = input("What letter would you like to be? X or O? \n").upper
        if playerletter == ("X"):
            computerletter = "O"
        elif playerletter == ("O"):
            computerletter = "X"
        else:
            loop = True
    return [playerletter, computerletter]

出于某种原因,无论我输入什么,这段代码都在循环和循环。当我打开调试器时,它说什么都没有分配给变量 "playercharacter"。

我打赌这很明显,当有人指出解决方案时,我会嘲笑自己。感谢您的帮助。

您在 .upper() 方法调用中缺少括号。

playerletter = input("What letter would you like to be? X or O? \n").upper

应该阅读

playerletter = input("What letter would you like to be? X or O? \n").upper()

以下代码

playerletter = input("What letter would you like to be? X or O? \n").upper

将返回字符串的方法对象赋值给playerletter变量。如果你在那行之后 print playerletter 你会得到:

<built-in method upper of str object at 0x7fa45670e508>

现在,由于 python 是动态类型的,因此将此值与 'X''O' 进行比较是完全有效的。因为两者都不匹配,所以 else: 子句是 运行,满足条件 playerletter not in "X O".split():,因为 ['X', ' ', 'O'] 不一定包含 <built-in method upper of str object at 0x7fa45670e508>,因此 while 循环无限重复。


这是您惯用的代码 Python:

def chooseletter():
    playerletter = ''

    # use a tuple of letters in condition instead of splitting
    while playerletter not in ('X', 'O'):
        playerletter = input("What letter would you like to be? X or O? \n").upper()

    # move the setting of computerletter outside the loop
    # use the X if Z else Y construction for simplicity
    computerletter = 'O' if playerletter == 'X' else 'X'

    # instead of returning 2 values in a list, return a tuple
    return playerletter, computerletter