我不是编程天才,但只是在今年年初,当我被教授命题逻辑时,我的老师告诉我(并且很明显)如果P为真,则不是(P)或〜P是假的,如果P是假的则相反。
阅读有关创建自定义对象的Python文档,我发现他们声称a==b
为True
并不意味着a!=b
为False
。这让我感到困惑,因为我认为!=
是对==
的否定,因此,每当使用==
进行评估时返回一个布尔结果,表达式!=
将始终评估为相反......据我所知,not(True)
评估为False
,not(False)
评估为True
。有人可以帮我理解这是怎么发生的吗?也许有一个例子?
我读到了这个here
引用:
x == y的真相并不意味着x!= y是假的。
答案 0 :(得分:3)
这是因为它们是可以单独自定义实现的运算符,并且运算符本身(在高级别)并不表示如果x==y
为真,则x!=y
为假(一个可以实施它们,以便不会出现这种关系。)
关键是文档中的声明:
因此,在定义
__eq__()
时,还应定义__ne__()
这样运营商就会按预期行事
当两者都实现时,运算符之间存在明确的关系。
答案 1 :(得分:0)
很大程度上这只是因为我们可以做愚蠢的事情:
class MessedUpShizzle:
def __eq__(self, other):
return True
def __ne__(self, other):
return True
MessedUpShizzle() == MessedUpShizzle()
#>>> True
MessedUpShizzle() != MessedUpShizzle()
#>>> True
如果您想知道 , 请注意x < y
和x >= y
不反转:
{1} < {2}
#>>> False
{1} >= {2}
#>>> False
所以我们需要单独定义__ge__
和__le__
。