我正在学习cpython内部结构(尤其是is
运算符),并IS_OP
在ceval.c中遇到了以下操作码实现
case TARGET(IS_OP): {
PyObject *right = POP();
PyObject *left = TOP();
int res = (left == right)^oparg;
PyObject *b = res ? Py_True : Py_False;
...
}
我知道前两个语句从堆栈中弹出操作数。
PyObject *right = POP();
PyObject *left = TOP();
但是我的问题与以下陈述有关。
int res = (left == right)^oparg;
在我理解is
的python中,运算符比较对象标识,在其他团队中,它将检查两个对象是否都指向同一对象。所以我的问题是,仅以下代码足以检查对象身份?,为什么实际的实现再次将专有的OR(^
)与oparg
?
int res = (left == right)
该IS_OP
操作码被用于两个 is
和is not
。在^oparg
当翻转比较的结果oparg
是1
(为is not
)和叶独自当它是0
(对is
),所以相同的字节码可以只通过调整branchlessly处理这两种情况oparg
(在dis
输出is
时IS_OP 0
,is not
是IS_OP 1
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句