Jul*_*ien 1 python python-2.7 containment
在像str in [str1, str2, str3]或的Python表达式1 in [1, 2, 3]中,in运算符是使用==还是is将第一个对象与列表中的对象进行比较?
这取决于对象如何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的所有比较的基本原理是什么?为什么会这样.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |