【问题标题】:Mutual exclusion expected with comparison operators比较运算符期望互斥
【发布时间】:2014-05-24 22:56:08
【问题描述】:

我不是编程天才,但就在今年年初,当我教命题逻辑时,我的老师告诉我(而且很明显)如果 P 为 True,not(P) 或 ~P 为 False ,如果 P 为 False,则相反。

阅读有关创建自定义对象的 Python 文档,我发现他们声称 a==bTrue 并不意味着 a!=bFalse。这让我很困惑,因为我认为 !=== 的否定,因此,每当使用 == 返回布尔结果时,表达式 != 的计算结果总是相反......我知道,not(True) 的计算结果为 Falsenot(False) 的计算结果为 True。有人可以帮我理解这是怎么发生的吗?举个例子吧?

我读到了这个权利here

引用:

x==y 的真值并不意味着 x!=y 是假的。

【问题讨论】:

    标签: python logic mutual-exclusion


    【解决方案1】:

    这是因为它们是可以单独自定义实现的运算符,并且运算符本身(在较高级别)并不规定如果x==y 为真那么x!=y 为假(一个可以 实现它们,使这种关系不遵循)。

    关键是文档中的声明如下:

    因此,在定义__eq__()时,还应该定义__ne__() 以便操作员按预期行事

    当两者都实现时,运算符之间存在显式关系。

    【讨论】:

    • 那么这是否意味着当我们谈论自定义对象时,这种行为并不是自我排斥的?
    • 没有。虽然定制本质上是没有隐含关系的原因,但由于没有隐含关系,因此应始终牢记记录在案的行为。 (在幕后,__eq__()__ne__() 都需要定义以获得预期的行为。
    • 好的。那么将__ne__() 定义为not(self.__eq__()) 是否“正确”?
    • 当然。关键是,如果你这样定义它,你就明确地建立了关系;它不是为你隐含的。
    • 仅供参考,如果您希望 python 填写“隐含关系”,请使用functools.total_ordering
    【解决方案2】:

    这主要是因为我们可以做些傻事:

    class MessedUpShizzle:
        def __eq__(self, other):
            return True
    
        def __ne__(self, other):
            return True
    
    MessedUpShizzle() == MessedUpShizzle()
    #>>> True
    
    MessedUpShizzle() != MessedUpShizzle()
    #>>> True
    

    如果您想知道如果 for 是什么,我想这主要是为了对称(因此是一个漂亮的实现)。考虑 x < yx >= ynot 逆:

    {1} < {2}
    #>>> False
    
    {1} >= {2}
    #>>> False
    

    所以我们需要分别定义__ge____le__

    【讨论】: