Python无比较:我应该使用"是"还是==?

Cla*_*ell 182 python comparison nonetype

可能重复:
`==`运算符何时不等于`is`运算符?(蟒蛇)

我使用的是Python 2.x.

我比较时编辑给了我一个"警告"下划线my_var == None,但是当我使用时没有警告my_var is None.

我在Python shell中做了一个测试,并确定两者都是有效的语法,但我的编辑器似乎说这my_var is None是首选.

是这种情况,如果是这样,为什么?

mgi*_*son 230

摘要:

使用is时要核对对象的身份(如检查,看看是否varNone).使用==时要检查的平等(例如是var等于3?).

说明:

您可以拥有my_var == None将返回的自定义类True

例如:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False
Run Code Online (Sandbox Code Playgroud)

is检查对象标识.只有一个对象None,所以当你这样做时my_var is None,你要检查它们是否实际上是同一个对象(而不仅仅是等效的对象)

换句话说,==是检查等价(从对象到对象定义),而is检查对象标识:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects
Run Code Online (Sandbox Code Playgroud)

  • ``None'与`== None`的不同之处是什么? (15认同)
  • @Blender在提到的情况下.`__eq__`可以用任何方式定义,但`is`的行为不能轻易改变. (10认同)
  • @LevLevitsky:Mython的一个示例用途是"扩展协议,以便任何操作符都可以重载,甚至是`is`".在对名单发表评论之后,他将其改为"......甚至`是`(但只有在你疯了的时候)." (4认同)
  • @abarnert - 我甚至不知道PEP 8在这里提出了建议.关键是他们是做不同事情的不同运营商.可能有些情况下`object == None`实际上*是*正确的习惯用法(尽管我无法想到任何问题).你只需要知道你在做什么. (2认同)

use*_*342 113

is当将任意对象与单身对比时通常是优选的,None因为它更快且更可预测.is总是按对象标识进行比较,而==做什么取决于操作数的确切类型,甚至取决于它们的排序.

PEP 8支持这一建议,它明确指出 "与单身人士的比较,如"无"应该始终使用,is或者is not从不使用相等运算符."

  • 感谢您发布此内容; 接受的答案会产生一些有趣的观点,但是你的答案会更直接地回答这个问题. (4认同)
  • @BallpointBen我认为关键是Python拥有强大的对象身份概念。如果你想检查一个对象是否与“None”进行比较,请务必使用“obj == None”。如果你想检查一个对象是否*是*“None”,请使用“obj is None”。PEP 8 建议(以及这个答案)的要点是,大多数人在想要检查 None 时都希望后者,而且它也恰好更快、更清晰。 (2认同)

Tho*_*anz 10

PEP 8定义了is在比较单例时最好使用运算符.


Dan*_*rno 5

我最近遇到了可能出错的地方。

import numpy as np
nparray = np.arange(4)

# Works
def foo_is(x=None):
    if x is not None:
        print(x[1])

foo_is()
foo_is(nparray)

# Code below raises 
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
def foo_eq(x=None):
    if x != None:
        print(x[1])

foo_eq()
foo_eq(nparray)
Run Code Online (Sandbox Code Playgroud)

我创建了一个函数,该函数可以选择将 numpy 数组作为参数,并在包含该数组时进行更改。如果我使用不等式运算符测试其包含情况!=,则会引发 ValueError (参见上面的代码)。如果我使用is not none,代码可以正常工作。

  • 根据您收到的错误......这与“无”无关。这与您将数组与无数组进行比较这一事实有关。它是导致问题的数组,而不是“None”。 (2认同)
  • 我不确定你想说什么?这就是重点吗?如果您只想检查它是否(完全)为 None,那么即使提供的值是完全不同的类型(例如数组),它也始终会使用“is”进行计算。而相等运算符仅针对同一类型定义。 (2认同)