在浏览文档时,特别是http://docs.python.org/2/reference/expressions.html#is,我仍然找不到定义Python关键字is
实现的dunder / protocol方法。什么方法决定它?据我所知,is
所做的就是在两个对象上调用时id
函数的结果。
答案 0 :(得分:10)
is
没有dunder方法。你无法覆盖它,这是故意的。 is
的重点在于它告诉您两个表达式是否引用相同的值。因此,根据定义,它必须是两个不同的值。所以没有必要覆盖它。
正如the docs所说:
运算符
is
和not is
测试对象标识:x is y
是真的,当且仅当 x 和 y 是同一个对象。
(Data model docs还有一点。)
此外,is
不会比较id
的结果。
id
被定义为返回“在该生命周期内保证该对象唯一且常量的整数”。这意味着is
当然可以使用id
,但我不知道它的任何实现。
话虽如此,在CPython中,它在覆盖范围内有效地做同样的事情 - is
检查指针是否相等,而id
将指针转换为整数并返回它。因此,直接实现它与通过id
实现它之间的唯一区别是一对额外的函数调用和一个编译为无机器代码的转换...
但在其他实施中,即使这可能也不是真的。 (当你认为Jython和PyPy是用甚至没有指针这样的东西的语言编写时,这应该是显而易见的。)例如,在PyPy中,is
检查底层的RPython对象是否为同样,id
会返回动态生成的密钥(如果您稍后在相同的值上调用id
则会缓存)。