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

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

关键修复点

  1. 移除了无意义的循环,直接一次性完成所有统计和提取操作
  2. 使用sum()函数将无色法术力的数字列表转换成总数值,确保所有参与相加的变量都是int类型
  3. 调整变量名(colorless_total)让逻辑更清晰,避免混淆列表和整数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:01:07