You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Python中TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'错误

解决石头剪刀布游戏的TypeError问题

嘿,我来帮你搞定这个错误!首先咱们先弄明白为什么会出现TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType':

这个错误的根源是当玩家输入的内容不是steen、papier或者schaar的时候,dictionary.get(p1)和dictionary.get(p2)会返回None——因为字典里找不到对应的键嘛!这时候你去做a - b,就相当于用两个None做减法,Python肯定不允许,所以就报错了。

你之前看到的“把print改成return”的建议,应该是其他代码场景(比如函数返回值)的解决方案,和你的问题完全不相关,别被带偏啦~你的核心问题是没有对玩家的输入做合法性校验,再加上几个小的代码细节问题,咱们一步步修正:

具体修正步骤

  • 添加输入校验:确保玩家必须输入字典里存在的选项,否则一直提示重新输入
  • 统一输入方法:你用的是Python 2,raw_input是正确获取字符串输入的方式,后面的input改成raw_input(Python 2里input会尝试执行输入的内容,很容易出问题)
  • 修正拼写错误:代码里的spelem是笔误,应该改成spelen
  • 简化重复逻辑:把“是否继续游戏”的代码抽出来,避免重复写三次

修正后的完整代码

while True:
    dictionary = {"steen": 1, "papier": 2, "schaar": 3}
    
    # 校验玩家1的输入,确保输入合法
    while True:
        p1 = raw_input("Maak een keuze: steen, papier of schaar: ")
        if p1 in dictionary:
            break
        print("Ongeldige keuze! Probeer opnieuw.")
    
    # 校验玩家2的输入,确保输入合法
    while True:
        p2 = raw_input("Maak een keuze: steen, papier of schaar: ")
        if p2 in dictionary:
            break
        print("Ongeldige keuze! Probeer opnieuw.")
    
    a = dictionary[p1]  # 因为已经校验过,直接用[]取值就行,不用get了
    b = dictionary[p2]
    dif = a - b
    
    if dif in [1, -2]:
        print("Speler 1 heeft gewonnen")
    elif dif in [-1, 2]:
        print("Speler 2 heeft gewonnen")
    else:
        print("Gelijkspel")
    
    # 统一的继续游戏逻辑
    while True:
        play_again = raw_input("Wilt u nog een keer spelen, ja of nee? ").strip().lower()
        if play_again in ["ja", "nee"]:
            break
        print("Voer alstublieft 'ja' of 'nee' in.")
    
    if play_again != "ja":
        print("Game over")
        break

改动说明

  • 新增的嵌套while循环会一直提示玩家输入,直到输入合法的选项为止,这样a和b就永远不会是None,减法运算自然不会报错
  • 因为已经做了输入校验,所以可以直接用dictionary[p1]取值,不用再用get(get是在不确定键是否存在时用的,现在确定存在,直接取值更直接)
  • 把重复的“继续游戏”逻辑抽出来,代码更简洁,也避免了拼写错误
  • 对play_again的输入做了小写处理,不管玩家输入"Ja"、"JA"还是"ja"都能正确识别

这样修改后,你的游戏就能正常运行,再也不会出现那个TypeError啦!

内容的提问来源于stack exchange,提问作者Jem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:27:27