'in'运算符是否使用"=="或"is"进行比较?

Jul*_*ien 1 python python-2.7 containment

在像str in [str1, str2, str3]或的Python表达式1 in [1, 2, 3]中,in运算符是使用==还是is将第一个对象与列表中的对象进行比较?

Mar*_*ers 5

这取决于对象如何in执行; 它不是in进行比较操作员,而是进行工作的object.__contains__方法.

对于Python标准容器类型(list,tuple,set,dict,等)两者的身份和平等被使用.查看会员测试操作部分的的表达式参考文档:

对于容器类型,例如list,tuple,set,frozenset,dict,或collections.deque,表达x in y相当于any(x is e or x == e for e in y).

is 测试速度更快,具有相同身份的对象意味着它们也是相同的.

自定义类型可以自由地实现他们想要在他们的__contains__方法中进行的任何测试.

接下来,如果没有__contains__定义方法,但是存在__iter__方法或__getitem__方法,则执行迭代搜索,其中再次测试所生成的值的身份和相等性.有关详细信息,请参阅上述链接文档 文档并不是关于身份测试的明确说明,但实现仍然使用身份,因为使用它是一种性能提升.

你可以在使用时看到这个float('nan'),它永远不会等于它自己或其他任何东西:

>>> nan = float('nan')
>>> nan == nan
False
>>> nan is nan
True
>>> nan in [nan]  # tests for identity first
True
>>> nan in iter([nan])  # an iterator, only __iter__ is defined
True
Run Code Online (Sandbox Code Playgroud)

float('nan')是正常期望的一个例外,即身份意味着平等; 请参阅IEEE754 NaN值返回false的所有比较的基本原理是什么?为什么会这样.

  • 您的摘要(使用"[...]标准容器类型[...]相等")与您的文档引用相矛盾.内置函数的成员资格测试使用*identity*和*value相等测试,首先测试身份,然后在身份测试失败时使用相等性. (2认同)