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
相关产品推荐
相关产品推荐

