在查看文档时,特别是这里http://docs.python.org/2/reference/expressions.html#is,我仍然找不到定义 Python 关键字实现的 dunder/protocol 方法is
。是什么方法决定的?据我了解,is
所做的只是比较id
在两个对象上调用该函数的结果。
1 回答
没有 dunder 方法is
。你不能覆盖它,这是故意的。的全部意义is
在于它告诉您两个表达式是否引用相同的值。因此,根据定义,对于两个不同的值,它必须是错误的。所以没有必要覆盖它。
正如文档所说:
对象身份的运算符
is
和测试:当且仅当x和y是同一个对象时为真。not is
x is y
(数据模型文档中还有更多内容。)
此外,is
不比较id
.
id
只是定义为返回“一个整数,该整数保证在其生命周期内对于该对象是唯一且恒定的”。这意味着is
当然可以使用id
,但我不知道它在哪里实现。
话虽如此,在 CPython 中,它实际上在幕后做同样的事情——<a href="http://hg.python.org/cpython/file/3.3/Python/ceval.c#l4430" rel="noreferrer ">is
检查指针是否相等,同时id
将指针转换为整数并返回它。因此,直接实现它与通过实现它的唯一区别id
是一对额外的函数调用和一个不会编译为机器代码的强制转换......</p>
但在其他实现中,即使这样也可能不正确。(这应该很明显,当您考虑 Jython 和 PyPy 是用甚至没有指针之类的语言编写的。)例如,在 PyPy 中,is
检查底层 RPython 对象是否相同,同时id
返回一个动态生成的密钥(如果您稍后调用id
相同的值,则缓存)。