在 Python 中的集合上使用反向联合或交集运算符有什么区别?
例如,
s & z对应于s.__and__(z)
z & s对应于s.__rand__(z)
如果这些应该返回相同的东西,为什么首先要有反向运算符?我错过了什么吗?
在 Python 中的集合上使用反向联合或交集运算符有什么区别?
例如,
s & z对应于s.__and__(z)
z & s对应于s.__rand__(z)
如果这些应该返回相同的东西,为什么首先要有反向运算符?我错过了什么吗?
set并frozenset遵循数字协议,他们没有明确定义反向操作,但他们“免费”获得这些操作,因为它们实现了正常的方法(如__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)。
所以我怀疑是否有反向联合和交集的用例,但它应该解释“为什么这些方法存在”。
__rand__仅当左操作数不支持相应操作并且操作数属于不同类型时才调用。
我想那只s.__rand__(z)会在幕后打电话z.__and__(s)。