Python 为什么可以添加到自身的类可以';不能总结吗?(a和a工作,总和([a,a])失败)
在下面的代码段中,我创建了一个计数器对象,并尝试使用三种方法将其添加到自身中。使用“+”、从列表中减少(内部操作与前面相同)和从列表中使用函数sum()的标准加法 前两个函数运行并返回预期结果,但第三个函数引发TypeError异常 从这里我有两个问题:Python 为什么可以添加到自身的类可以';不能总结吗?(a和a工作,总和([a,a])失败),python,Python,在下面的代码段中,我创建了一个计数器对象,并尝试使用三种方法将其添加到自身中。使用“+”、从列表中减少(内部操作与前面相同)和从列表中使用函数sum()的标准加法 前两个函数运行并返回预期结果,但第三个函数引发TypeError异常 从这里我有两个问题: 如果加法有效,sum()失败的原因是什么 当我使用+添加到对象时,将使用类的_uuu添加uu_u)方法。调用sum()时使用什么方法(如果有) 计数器只是一个例子,我感兴趣的是一般情况,而不是在创建新类时的特殊情况 from collectio
from collections import Counter
from functools import reduce
a = Counter([1,1,1,1])
print(a+a+a)
print(reduce(lambda x, y: x + y, [a,a, a]))
sum([a, a, a])
印刷品:
Counter({1: 12})
Counter({1: 12})
Traceback (most recent call last):
File "/home/user/.PyCharmCE2019.3/config/scratches/scratch.py", line 20, in <module>
print(sum([a, a,]))
TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
计数器({1:12})
计数器({1:12})
回溯(最近一次呼叫最后一次):
文件“/home/user/.PyCharmCE2019.3/config/scratches/scratch.py”,第20行,在
打印(总和([a,a,]))
TypeError:不支持+:“int”和“Counter”的操作数类型
这是因为sum([a,a])
没有做a+a
;它实际上是在做0+a+a
。计数器
类实例可以添加到计数器
的实例中,但不能添加到整数0
想想你自己是如何编写sum
函数的:
def总和(lst):
总数=0
对于lst中的x:
总数+=x
返回总数
原则上,您可以初始化total=lst[0]
,然后迭代lst[1:][/code>以添加剩余值。问题是,你不能得到一个空序列的和。因此Python的实际sum
函数与上面的代码类似,除了可以指定起始值(),所以实际上更像这样:
def总和(lst,开始=0):
总计=开始
对于lst中的x:
总数+=x
返回总数
这意味着对于您想要的行为,您可以执行sum([a,a],Counter())
,因为“空”的计数器的作用与0
用于添加数字的作用相同
在一般情况下,您的类需要一个值作为sum
的起始值;如果“identity”没有合适的值,您应该使用reduce
。答案很好!文档还提供了一些细节:谢谢,非常好的解释!在文档中,我看到了“开始默认为0”位,但我的大脑不理解这到底意味着什么。