在Python中的集合上使用反向联合或交集运算符之间有什么区别吗?
例如,
s & z
对应s.__and__(z)
z & s
对应s.__rand__(z)
如果这些应该返回相同的东西,为什么首先使用反向运算符?我错过了什么吗?
答案 0 :(得分:3)
set
和frozenset
遵循号码协议,他们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。但是在普通set
和frozenset
的情况下,这并没有任何区别,因为它们不会相互继承。
如果第一个操作数在其NotImplemented
中返回__add__
,则也会使用这些反向操作。但同样,这对set
和frozenset
并不是非常有用,因为它们只允许与其他set
相同的操作 - 至少set
和frozenset
当另一个操作数是另一个NotImplemented
时,不要返回set
。
同样z & s
与s.__rand__(z)
不对应,除非s
是z
的子类。否则,z.__and__(s)
之前将尝试s.__rand__(z)
。
所以我怀疑反转联合和交集有用例,但它应该解释为什么这些方法存在"。
答案 1 :(得分:0)
我认为s.__rand__(z)
只会打电话给z.__and__(s)
。