8

在查看文档时,特别是这里http://docs.python.org/2/reference/expressions.html#is,我仍然找不到定义 Python 关键字实现的 dunder/protocol 方法is。是什么方法决定的?据我了解,is所做的只是比较id在两个对象上调用该函数的结果。

4

1 回答 1

11

没有 dunder 方法is。你不能覆盖它,这是故意的。的全部意义is在于它告诉您两个表达式是否引用相同的值。因此,根据定义,对于两个不同的值,它必须是错误的。所以没有必要覆盖它。

正如文档所说:

对象身份的运算符is和测试:当且仅当xy是同一个对象时为真。not isx 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相同的值,则缓存)。

于 2013-08-28T19:21:04.417 回答