Python中反向集合运算符的实际应用

时间:2017-04-04 02:17:12

标签: python python-3.x set set-intersection set-union

在Python中的集合上使用反向联合或交集运算符之间有什么区别吗?

例如,

s & z对应s.__and__(z)

z & s对应s.__rand__(z)

如果这些应该返回相同的东西,为什么首先使用反向运算符?我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

setfrozenset遵循号码协议,他们don't define the reversed operations explicitly但他们可以免费获得这些""因为他们implement the normal methods (like __and__)

然而,在处理子类时反向操作特别有用,因为right operand is a subclass of the left operand the reversed operation is attempted first。但是在普通setfrozenset的情况下,这并没有任何区别,因为它们不会相互继承。

如果第一个操作数在其NotImplemented中返回__add__,则也会使用这些反向操作。但同样,这对setfrozenset并不是非常有用,因为它们只允许与其他set相同的操作 - 至少setfrozenset当另一个操作数是另一个NotImplemented时,不要返回set

同样z & ss.__rand__(z)不对应,除非sz的子类。否则,z.__and__(s)之前将尝试s.__rand__(z)

所以我怀疑反转联合和交集有用例,但它应该解释为什么这些方法存在"。

答案 1 :(得分:0)

仅当左操作数不支持相应操作且操作数类型不同时,才会调用

__rand__

我认为s.__rand__(z)只会打电话给z.__and__(s)