4

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

4

2 回答 2

7

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

对于 Python 标准容器类型(listtuplesetdict等),标识和相等都被使用。请参阅表达式参考文档的成员资格测试操作部分:

对于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

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

于 2018-03-14T00:51:20.543 回答
0

它似乎使用==. 通过以下测试:

Python 2.7.14 (default, Mar  1 2018, 19:24:37)
$ str1 = 'a bc'
$ str1 is 'a bc' # returns False
$ str1 in ['a bc'] # returns True

任何有关此的官方文档的链接将不胜感激!到目前为止,我的 Google-fu 让我失望了。

于 2018-03-14T00:44:36.873 回答