Python开发21点游戏时出现NoneType和无效字面量错误如何解决?
问题定位与修复方案
第一个报错:AttributeError: 'NoneType' object has no attribute 'append'
原因
Player类的hand属性默认值设为None,调用append方法时None没有对应方法。另外不能直接将hand的默认值设为[],因为dataclass中可变类型的默认值会被所有实例共享,导致多个玩家共用同一只手牌的逻辑错误。
修复方法
使用field(default_factory=list)定义hand的默认值,让每个实例初始化时自动生成独立的空列表:
from dataclasses import field # 替换Player类中hand的定义 hand: List[Card] = field(default_factory=list)
第二个报错:ValueError: invalid literal for int() with base 10: 'A'
原因
compute_card_value方法的判断逻辑错误:你拿整个Card类实例和字符串"J"/"Q"/"K"/"A"做比较,永远返回False,所以所有卡牌都会走到else分支尝试将card.rank转成整数,遇到非数字的牌面就会报错。
修复方法
判断时取Card实例的rank属性做对比:
def compute_card_value(self, card): # 取card.rank判断,而不是card本身 if card.rank in ["J", "Q", "K"]: value = 10 elif card.rank == "A": if self.values > 10: value = 1 else: value = 11 else: value = int(card.rank) return value
额外需要修正的逻辑问题
你当前代码中Dealer类的缩进错误,被定义成了Player的内部类,应该调整缩进和Player同级,否则初始化和继承逻辑都会异常。
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

