8

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

例如,

s & z对应于s.__and__(z)

z & s对应于s.__rand__(z)

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

4

2 回答 2

3

setfrozenset遵循数字协议,他们没有明确定义反向操作,但他们“免费”获得这些操作,因为它们实现了正常的方法(如__and__

然而,逆向运算在处理子类时特别有用,因为如果右操作数是左操作数的子类,则首先尝试逆向操作。但是在普通set的 s 和frozensets 的情况下,这没有任何区别,因为它们不会相互继承。

NotImplemented如果第一个操作数在 it's 中返回,也会使用这些反向操作__add__。但同样,这对于set并且frozenset因为它们只允许与其他set类似的操作并且至少set并且当另一个操作数是 another 时frozenset不返回,所以这并不是真正有用的。NotImplementedset

也不z & s对应于s.__rand__(z),除非s是 的子类z。否则z.__and__(s)之前会尝试s.__rand__(z)

所以我怀疑是否有反向联合和交集的用例,但它应该解释“为什么这些方法存在”。

于 2017-04-04T02:39:56.573 回答
0

__rand__仅当左操作数不支持相应操作并且操作数属于不同类型时才调用。

我想那只s.__rand__(z)会在幕后打电话z.__and__(s)

于 2017-04-04T02:32:52.597 回答