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

Python二十一点游戏字典访问出现TypeError的解决咨询

修复Python二十一点游戏中的字典访问TypeError问题

我来帮你搞定这个问题~你这段代码的bug其实很好找:你随机选了一张牌的键之后,立刻把它从字典里删掉了,之后再用deck.get(number)去拿它的值,这时候字典里已经没有这个键了,get方法就会返回None,你再把None转成int自然就会抛出TypeError了。

先看你原来的代码:

import random 
deck= {'K ♥':'10' ,'Q ♥':'10','J ♥':'10','10 ♥':'10','9 ♥':'9','8 ♥':'8','7 ♥':'7','6 ♥':'6','5 ♥':'5','4 ♥':'4','3 ♥':'3','2 ♥':'2','A ♥':'11','K◆':'10','Q◆':'10','J◆':'10','10◆':'10','9◆':'9','8◆':'8','7◆':'7','6◆':'6','5◆':'5','4◆':'4','3◆':'3','2◆':'2','A◆':'11','K ♣':'10','Q ♣':'10','J ♣':'10','10 ♣':'10','9 ♣':'9','8 ♣':'8','7 ♣':'7','6 ♣':'6','5 ♣':'5','4 ♣':'4','3 ♣':'3','2 ♣':'2','A ♣':'11','K ♠':'10','Q ♠':'10','J ♠':'10','10 ♠':'10','9 ♠':'9','8 ♠':'8','7 ♠':'7','6 ♠':'6', '5 ♠':'5','4 ♠':'4','3 ♠':'3','2 ♠':'2','A ♠':'11'} 
number= random.choice(list(deck.keys())) 
del deck[number] 
number2= random.choice(list(deck.keys())) 
print(number) 
print(number2) 
value1 = int(deck.get(number)) 
value2 =int(deck.get(number2)) 
print(value1+value2)

运行时抛出的错误:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

修复方案

最简单的解决思路是先拿到牌的数值,再删除对应的键,或者直接用字典的pop()方法——这个方法可以同时完成「获取键对应的值」和「删除该键」两个操作,非常适合你的场景。

下面是修改后的代码:

import random 
deck= {'K ♥':'10' ,'Q ♥':'10','J ♥':'10','10 ♥':'10','9 ♥':'9','8 ♥':'8','7 ♥':'7','6 ♥':'6','5 ♥':'5','4 ♥':'4','3 ♥':'3','2 ♥':'2','A ♥':'11','K◆':'10','Q◆':'10','J◆':'10','10◆':'10','9◆':'9','8◆':'8','7◆':'7','6◆':'6','5◆':'5','4◆':'4','3◆':'3','2◆':'2','A◆':'11','K ♣':'10','Q ♣':'10','J ♣':'10','10 ♣':'10','9 ♣':'9','8 ♣':'8','7 ♣':'7','6 ♣':'6','5 ♣':'5','4 ♣':'4','3 ♣':'3','2 ♣':'2','A ♣':'11','K ♠':'10','Q ♠':'10','J ♠':'10','10 ♠':'10','9 ♠':'9','8 ♠':'8','7 ♠':'7','6 ♠':'6', '5 ♠':'5','4 ♠':'4','3 ♠':'3','2 ♠':'2','A ♠':'11'} 

# 用pop方法同时获取值并删除键
number = random.choice(list(deck.keys()))
value1 = int(deck.pop(number))

number2 = random.choice(list(deck.keys()))
value2 = int(deck.pop(number2))

print(number)
print(number2)
print(value1 + value2)

为什么这样能解决问题?

原来的代码中,你执行del deck[number]之后,number这个键已经从字典里消失了,再调用deck.get(number)就只能得到None。而pop()方法会先返回该键对应的数值,然后再把键从字典中移除,这样我们既能拿到正确的数值,也保证了牌不会被重复抽到。

如果你不想用pop(),也可以先存值再删除,写法如下:

number = random.choice(list(deck.keys()))
value1 = int(deck[number])  # 先拿值
del deck[number]  # 再删除

效果和pop()是一样的,只是pop()更简洁高效。

内容的提问来源于stack exchange,提问作者Fiona Almeyda Wijaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:50:32