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

时间:2018-03-14 00:44:37

标签: python python-2.7 containment

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

2 个答案:

答案 0 :(得分:5)

这取决于对象in的执行方式;进行比较的不是in运算符,正是object.__contains__ method才能完成工作。

对于Python标准容器类型(listtuplesetdict等)使用身份和等式 。请参阅表达式参考文档的Membership test operations section

  

对于listtuplesetfrozensetdictcollections.deque等容器类型,表达式{{1 }}相当于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 是正常期望的异常,即身份意味着平等;请参阅What is the rationale for all comparisons returning false for IEEE754 NaN values?了解原因。

答案 1 :(得分:-1)

似乎使用了==。通过以下测试:

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

任何关于此官方文档的链接将不胜感激!到目前为止,我的谷歌已经失败了。