Python的"!="操作与"is not"操作不同。
Python的"!="操作与"is not"操作不同。
在这个问题的评论中,我看到了一个建议使用
result is not None
而不是
result != None
有什么区别?为什么会推荐使用其中之一?
Python中的"!="操作符和"is not"操作符的区别是什么?为什么会出现这个问题?以及如何解决这个问题?
在Python中,"!="操作符用于比较两个对象的值是否不相等,而"is not"操作符用于比较两个对象是否不是同一个对象。这两个操作符之间的区别在于比较的对象的类型和比较的方式。
出现这个问题的原因是因为在比较对象时,有时候我们关心的是对象的值是否相等,而有时候我们关心的是对象是否是同一个对象。
为了解决这个问题,我们需要根据具体的比较需求选择使用不同的操作符。当比较对象的值时,应该使用"!="操作符;当比较对象是否是同一个对象时,应该使用"is not"操作符。
在比较对象是否是同一个对象时,使用"is not"操作符比"!="操作符更加高效。因为在Python中,None是一个单例对象,内存中只有一个实例。通过使用"is not"操作符来比较对象是否是None,Python可以快速地检查对象的内存地址是否与全局的None对象相同,这是一个非常快速的比较过程。
而当比较对象的值时,使用"!="操作符会更加合适。因为在这种情况下,Python需要查找对象是否有实现了"__eq__"方法。如果没有实现该方法,Python会查找对象的父类是否有实现了"__eq__"方法。如果找到了实现了"__eq__"方法的父类,Python会调用该方法进行比较。这个过程可能会比较耗时,特别是当"__eq__"方法比较缓慢且没有立即返回时。
如果没有实现"__eq__"方法,Python可能会使用默认的"object"类上的"__eq__"方法进行比较,该方法只会检查对象的身份是否相同。
当比较对象是否是None时,应该使用"is not"操作符;当比较对象的值时,应该使用"!="操作符。在比较其他类型的对象时,也应该根据具体的需求选择合适的操作符。
Python中的"=="是一个等号测试。它检查左右两边的对象是否相等(根据它们的__eq__或__cmp__方法)。
"is"是一个身份测试。它检查左右两边的对象是否是同一个对象。不进行方法调用,对象不能影响"is"操作。
我们使用"is"(和"is not")来处理单例对象,比如None,这样我们就不用关心可能想要伪装成None的对象,或者保护对象在与None进行比较时不会出现问题。
谢谢你的回答 - 你能详细说明一下对象在与None进行比较时可能会出现问题的情况吗?
None几乎没有方法和属性。如果你的__eq__测试期望一个方法或属性,它可能会出现问题。例如,如果other恰好是None,那么def __eq__( self, other ): return self.size == other.size
就会出问题。
我理解这个问题的方法是:Python的"is"就像Java的"=="。Python的"=="就像Java的".equals()"。当然,只有当你了解Java时,这才有帮助。
在PHP或JavaScript中,我们会说"is"就像"==="(非常相等),而"is not"则像"!=="(不完全相等)。
"is not"是一个单独的运算符,还是在内部否定"is"的结果,就像"not foo is bar"一样?
很好的答案!补充一下,一个在与None进行比较时会出问题的对象的例子是dateutil.relativedelta.relativedelta对象。当与"!= None"进行比较时,它将返回False,当与"== None"进行比较时,它也将返回False。很奇怪,我知道。
Moosvi,我也在想同样的问题,但我们可以通过检查"is not"是否确实是一个单独的运算符来解决:False is not None # True,但False is (not None) # False。
== 操作符用于比较两个对象的值是否相等,而 is 操作符用于比较两个对象是否是同一个对象。在Python中,is操作符是通过比较两个对象的id来判断的。如果两个对象的id相等,那么它们就是同一个对象。
上面的代码中定义了一个名为Bad的类,该类的__eq__方法返回了True。然后创建了一个Bad类的实例c。接下来分别使用is和==操作符来比较c和None。
使用is操作符比较c和None,结果为False。这是因为is操作符比较的是两个对象的id,而c和None的id不相等。
使用==操作符比较c和None,结果为True。这是因为==操作符会调用对象的__eq__方法来比较两个对象的值是否相等。而在Bad类的__eq__方法中,总是返回True,所以c == None的结果为True。
出现这个问题的原因是因为在Python中,is操作符和==操作符的实现方式是不同的。is操作符是通过比较两个对象的id来判断的,而==操作符是通过调用对象的__eq__方法来判断的。
要解决这个问题,可以使用is not操作符来判断两个对象是否不是同一个对象。is not操作符是is操作符的反操作,它返回True表示两个对象不是同一个对象。
下面是使用is not操作符来判断c和None是否不是同一个对象的示例代码:
c is not None # True
通过使用is not操作符,可以正确判断两个对象是否不是同一个对象。