Python 是';在';“操作员使用”==&引用;或;是";比较一下?

Python 是';在';“操作员使用”==&引用;或;是";比较一下?,python,python-2.7,containment,Python,Python 2.7,Containment,在[str1,str2,str3]中的str或[1,2,3]中的1这样的Python表达式中,中的操作符是否使用=或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 任何与此相关的官方文件链接都将不胜感激!到目前为止

在[str1,str2,str3]中的
str或[1,2,3]
中的
1这样的Python表达式中,
中的
操作符是否使用
=
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让我失望。

这取决于对象如何执行
中的
;进行比较的不是
中的
,而是执行工作的

对于Python标准容器类型(
list
tuple
set
dict
,等等),使用了标识和相等。请参阅参考文档中的表达式:

对于诸如
list
tuple
set
frozenset
dict
、或
collections.deque
,表达式
x in y
相当于
any(x是e或x==e表示y中的e)

is
测试速度更快,具有相同标识的对象意味着它们也相等

自定义类型可以自由地在其
\uuuuu包含的方法中实现任何测试

接下来,如果没有定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。有关详细信息,请参见上述链接文档;文档中并没有明确说明身份测试,但是实现仍然使用身份,因为使用身份可以提高性能

当您使用
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')
是身份意味着平等的正常期望的例外;请参阅以了解原因。

您的摘要(说“对于[…]标准容器类型[…]使用相等”)与您在文档中的引用相矛盾。内置的成员资格测试同时使用身份和值相等测试,首先测试身份,如果身份测试失败,则测试相等。@ShadowRanger:是的,已经很晚了,我真的应该到此为止。谢谢你指出这一点