'in' 运算符是否使用“==”或 "is" 进行比较?
Does the 'in' operator use "==" or "is" for comparisons?
在像 str in [str1, str2, str3]
或 1 in [1, 2, 3]
这样的 Python 表达式中,in
运算符是否使用 ==
或 is
来比较第一个对象与列表中的对象?
好像要用==
。通过以下测试:
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 让我失望了。
这取决于对象如何执行in
; 不是 in
运算符 进行比较,而是 object.__contains__
method 进行比较。
对于Python标准容器类型(list
、tuple
、set
、dict
等)两者都标识和相等 被使用。请参阅 Expressions 参考文档的 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')
是身份意味着平等的正常期望的 例外 ;看到 What is the rationale for all comparisons returning false for IEEE754 NaN values? 为什么会这样。
在像 str in [str1, str2, str3]
或 1 in [1, 2, 3]
这样的 Python 表达式中,in
运算符是否使用 ==
或 is
来比较第一个对象与列表中的对象?
好像要用==
。通过以下测试:
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 让我失望了。
这取决于对象如何执行in
; 不是 in
运算符 进行比较,而是 object.__contains__
method 进行比较。
对于Python标准容器类型(list
、tuple
、set
、dict
等)两者都标识和相等 被使用。请参阅 Expressions 参考文档的 Membership test operations section:
For container types such as
list
,tuple
,set
,frozenset
,dict
, orcollections.deque
, the expressionx in y
is equivalent toany(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')
是身份意味着平等的正常期望的 例外 ;看到 What is the rationale for all comparisons returning false for IEEE754 NaN values? 为什么会这样。