Python中MTG_card类法术力值求和报错:int与list无法相加
问题:类型转换错误导致无法正确计算法术力费用总和
我在类型转换方面一直有问题,这是最近遇到的一个实例。我想把变量b、w、r、u、g和colorless的值相加,返回一个int类型的结果。附上完整的类代码,可能存在多个问题:
import re class MTG_card: def __init__(self, card_type, rarity, mana_cost, modifier_1=None, modifier_2=None, modifier_3=None): self.card_type = card_type self.rarity = rarity self.mana_cost = mana_cost self.modifier_1 = modifier_1 self.modifier_2 = modifier_2 self.modifier_3 = modifier_3 def conv_mana_cost(self): for cost in self.mana_cost: b = self.mana_cost.count('b') w = self.mana_cost.count('w') r = self.mana_cost.count('r') u = self.mana_cost.count('u') g = self.mana_cost.count('g') colorless = [int(n) for n in re.findall(r'\b\d+\b', self.mana_cost)] return (b + w + r + u + g + colorless) obj_1 = MTG_card('enchantment', 'rare', 'b, b, g, 3') print(obj_1.conv_mana_cost())
我预期返回结果为6,但实际得到如下报错:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /var/folders/6h/f_vphymd1dj11mtbg20qwxsm0000gn/T/ipykernel_21902/1882525478.py in <module> 25 26 obj_1 = MTG_card('enchantment', 'rare', 'b, b, g, 3') ---> 27 print(obj_1.conv_mana_cost()) /var/folders/6h/f_vphymd1dj11mtbg20qwxsm0000gn/T/ipykernel_21902/1882525478.py in conv_mana_cost(self) 22 colorless = [int(n) for n in re.findall(r'\b\d+\b', self.mana_cost)] 23 ---> 24 return (b + w + r + u + g + colorless) 25 26 obj_1 = MTG_card('enchantment', 'rare', 'b, b, g, 3') TypeError: unsupported operand type(s) for +: 'int' and 'list'
问题分析与修复
报错核心原因:colorless是一个列表(list),而b、w、r、u、g都是整数(int),整数和列表无法直接用+运算。另外代码还有两个冗余问题:
for cost in self.mana_cost循环完全没必要,里面的操作都是基于整个字符串重复执行,纯粹浪费资源- 提取的无色法术力数字是列表,需要求和后才能和其他整数相加
修复后的代码:
import re class MTG_card: def __init__(self, card_type, rarity, mana_cost, modifier_1=None, modifier_2=None, modifier_3=None): self.card_type = card_type self.rarity = rarity self.mana_cost = mana_cost self.modifier_1 = modifier_1 self.modifier_2 = modifier_2 self.modifier_3 = modifier_3 def conv_mana_cost(self): # 统计各颜色法术力的数量 b = self.mana_cost.count('b') w = self.mana_cost.count('w') r = self.mana_cost.count('r') u = self.mana_cost.count('u') g = self.mana_cost.count('g') # 提取所有无色法术力数字并求和 colorless_nums = [int(n) for n in re.findall(r'\b\d+\b', self.mana_cost)] colorless_total = sum(colorless_nums) # 所有值都是整数,可直接相加 return b + w + r + u + g + colorless_total obj_1 = MTG_card('enchantment', 'rare', 'b, b, g, 3') print(obj_1.conv_mana_cost()) # 输出6
关键修复点
- 移除了无意义的循环,直接一次性完成所有统计和提取操作
- 使用
sum()函数将无色法术力的数字列表转换成总数值,确保所有参与相加的变量都是int类型 - 调整变量名(
colorless_total)让逻辑更清晰,避免混淆列表和整数值
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

