在 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 和frozenset
s 的情况下,这没有任何区别,因为它们不会相互继承。
NotImplemented
如果第一个操作数在 it's 中返回,也会使用这些反向操作__add__
。但同样,这对于set
并且frozenset
因为它们只允许与其他set
类似的操作并且至少set
并且当另一个操作数是 another 时frozenset
不返回,所以这并不是真正有用的。NotImplemented
set
也不z & s
对应于s.__rand__(z)
,除非s
是 的子类z
。否则z.__and__(s)
之前会尝试s.__rand__(z)
。
所以我怀疑是否有反向联合和交集的用例,但它应该解释“为什么这些方法存在”。
__rand__
仅当左操作数不支持相应操作并且操作数属于不同类型时才调用。
我想那只s.__rand__(z)
会在幕后打电话z.__and__(s)
。