Python 是';在';“操作员使用”==&引用;或;是";比较一下?
在[str1,str2,str3]中的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 任何与此相关的官方文件链接都将不胜感激!到目前为止
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:是的,已经很晚了,我真的应该到此为止。谢谢你指出这一点