'not =='和'!=之间存在逻辑差异(不是)

时间:2012-03-21 03:57:55

标签: python syntax boolean-expression

Python 3.x之间是否存在实质性差异:

for each_line in data_file:
    if each_line.find(":") != -1:
        #placeholder for code
        #more placeholder

for each_line in data:
    if not each_line.find(":") == -1:
        #placeholder for code
        #more placeholder

我的问题不是特别针对上述用法,而是更一般或必要 - 这种语法差异是否以不同的方式工作,即使结果是相同的?有逻辑差异吗?是否存在一个更合适的任务,或者仅仅是风格上的差异?如果这只是风格,Python程序员认为哪一个更干净?

另外,上面是一个相反的例子,询问is==之间有什么区别?前者和后者一样,是对象身份和对象价值平等的区别吗?我的意思是,在上面的示例中,隐含使用is的{​​{1}}是什么?

3 个答案:

答案 0 :(得分:6)

据我了解, 在功能上它们并不完全相同;如果你要与一个类进行比较,那么该类可以有一个成员函数__ne__,它在使用比较运算符时调用!=,而不是在使用比较时调用的__eq__ == < / p>

所以,在这种情况下,
not (a == b)会在a上调用__eq__,以b为参数,然后not结果
(a != b)会在a上调用__ne__,以b为参数。

我会使用第一种方法(使用!=)进行比较

答案 1 :(得分:4)

根据您使用的是==还是!=,会调用不同的rich comparison方法。

class EqTest(object):
    def __eq__(self, other):
        print "eq"
        return True
    def __ne__(self, other):
        print "ne"
        return False

a = EqTest()
b = EqTest()

print not (a == b)
# eq
# False
print a != b
# ne
# False

据我所知,您将获得所有内置类型的相同结果,但理论上它们可能对某些用户定义的对象有不同的实现。

我会使用!=代替not==,因为它只是一次操作而不是两次。

答案 2 :(得分:1)

您的第一个示例是您应该如何测试find的结果。

你的第二个例子是做得太多了。它还会对each_line.find(":") == -1表达式的结果执行boolean not

在这种情况下,你想要使用not的地方是你有什么东西可以测试真实性或虚假性。
例如,空字符串''的计算结果为False:

s = ''
if not s:
    print('s is the empty string')

您似乎将身份测试表达式isis not与布尔not混为一谈。

您如何执行身份测试的示例:

result_of_comparison = each_line.find(":") == -1
if result_of_comparison is False: # alternatively: is not True
    pass