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

Python sum函数是否会默认加隐藏0导致自定义__add__类实例求和报错?

报错原因

你猜测的逻辑完全正确,Python 内置sum函数确实默认使用整数0作为求和初始值,这是触发报错的直接原因。

sum函数的完整语法为sum(iterable, start=0),执行逻辑为:

  • 以start参数作为初始累加值
  • 依次遍历迭代器内的元素,和当前累加值执行+运算,更新累加值
  • 最终返回最终累加值

你调用sum([example_1, example_2])时没有指定start,默认使用0,第一步运算就会执行0 + example_1:整数的__add__方法不支持和自定义Example类实例相加,同时你的Example类没有实现反向加法方法__radd__来处理自身作为右操作数的加法场景,就会抛出你遇到的类型错误。

补充:你贴出的Example类代码存在小疏漏,__init__方法漏写了第一个必填的实例参数self,正确定义应为def __init__(self, x, y):,否则实例化时会触发参数数量不匹配的错误

解决方案

有两种常见的方案可以解决这个问题:

方案1:显式指定sum的初始值

给sum传入符合类型要求的加法单位元作为start参数,对于你的Example类来说,加法单位元就是x、y均为0的实例:

example_summed = sum([example_1, example_2], Example(0, 0))
print(example_summed.x) # 输出6,符合预期

方案2:给Example类实现__radd__方法

实现反向加法方法,处理Example实例作为右操作数的加法场景,遇到和0相加的情况直接返回自身即可兼容默认的sum逻辑:

class Example:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, example):
        return Example(
          x=self.x + example.x,
          y=self.y + example.y
        )
    
    def __radd__(self, other):
        if other == 0:
            return self
        # 其他非0值的加法场景可以根据业务需求补充逻辑
        return self + other

实现后直接调用默认参数的sum也能正常运行:

example_summed = sum([example_1, example_2])
print(example_summed.x) # 输出6,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:18:03