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

标签 python python-2.7 containment

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

最佳答案

这取决于对象如何执行in;进行比较的不是 in 运算符,而是 object.__contains__ method就可以了。

对于Python标准容器类型(listtuplesetdict等)< em>identity 和 equality 都用到了。查看Membership test operations section 表达式引用文档:

For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to 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') 是身份意味着平等的正常期望的一个异常(exception);见What is the rationale for all comparisons returning false for IEEE754 NaN values?为什么会这样。

关于python - 'in' 运算符是否使用 "=="或 "is"进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49268124/

相关文章:

ios - 查看 Controller 遏制 Z 位置

python - 如何在Python Django中从数据库表中获取相关类别产品?

python - 对列表列表进行排序/组合

python - 无限序列。无法在 1 秒内处理答案

python - 在Python中对txt文件的数字求和

c++ - operator[] 歧义消解

python - python字典中的反向键值配对

Python cx_oracle 通过位置绑定(bind)变量忽略数字

python - 初始化顺序导致类实例问题