'is'的Python-dunder方法`

'is'的Python-dunder方法`,python,Python,在浏览文档时,特别是在这里,我仍然找不到dunder/protocol方法,该方法定义了Python关键字is的实现。什么方法决定它?据我所知,is所做的一切就是在两个对象上调用id函数时比较结果。对于is没有dunder方法。你不能推翻它,这是故意的。的要点在于它告诉您两个表达式引用的值是否相同。因此,根据定义,对于两个不同的值,它必须是假的。所以没有必要重写它 正如它所说: 运算符为和非测试对象标识:x为y当且仅当x和y为同一对象时为真 (后面还有一点。) 另外,is不会比较id的结果 只

在浏览文档时,特别是在这里,我仍然找不到dunder/protocol方法,该方法定义了Python关键字
is
的实现。什么方法决定它?据我所知,
is
所做的一切就是在两个对象上调用
id
函数时比较结果。

对于
is
没有dunder方法。你不能推翻它,这是故意的。
的要点在于它告诉您两个表达式引用的值是否相同。因此,根据定义,对于两个不同的值,它必须是假的。所以没有必要重写它

正如它所说:

运算符
测试对象标识:
x为y
当且仅当x和y为同一对象时为真

(后面还有一点。)


另外,
is
不会比较
id
的结果

只是定义为返回“一个整数,该整数在对象的生命周期内保证是唯一的和恒定的”。这意味着
is
当然可以使用
id
,但我不知道它在哪里实现

这就是说,在CPython中,它实际上做了同样的事情——检查指针是否相等,同时将指针转换为整数并返回它。因此,直接实现它与通过
id
实现它之间的唯一区别是额外的一对函数调用和编译为无机器代码的转换


但在其他实现中,甚至可能不是这样。(显然,当你认为Jython和PyPy是用甚至没有指针的语言编写的)。例如,在PyPy,<代码>是< /Cord>检查底层RPython对象是相同的,而<代码> ID>代码>返回一个在飞行中生成的密钥。(如果以后对同一个值调用
id
,则缓存).

您是对的;
id
返回对象的内存位置。因此,除非您想将对象放在RAM中的某个特定位置,否则您永远不需要编写自己的
is
实现。如果您想检查两个对象的等效性,请使用
\ueq\uuu
instead@inspectorG4dget谢谢!我刚学会@StevenRumbalski Ha的意思是,向上投票以表示感谢:p@inspectorG4dget:这有点误导,因为这只适用于CPython。Jython或PyPy即使想返回内存位置也无法返回。等等,所以对于
is
,没有纯python实现,都是C?不。如果
a
在<代码> b>代码>,尽管对象不同,但它们可能具有相同的ID。这是不可能的,<>代码> ,因为两个对象必须生存直到操作符被评估。它可以被收集在它的ID的评估和<代码> B<代码>的创建之间。考虑调用<代码> ID([])=ID([])< /代码>。(当我刚刚尝试时,它返回了
True
)。创建第一个列表,然后计算其ID。此时,不再有对它的引用,可以对其进行GC'd。然后创建第二个列表,并且可以自由地重用刚刚收集的对象。@EdgararRoutiounian:如果您存储
ID
数字,然后进行比较,也会发生此问题。正确使用
ID
因为任何不能用
is
完成的事情都可能很棘手;你必须确保只比较
id
具有重叠生存期的对象的数量。@nmclean:如果
a
b
是变量,它们将不会被收集,但是如果它们是任意表达式的占位符,
a
可能被收集计算
id(a)
后的ctable。请尝试
id([])==id([])
并查看得到的结果。