以下代码在cpython中做了什么
What does the following code do in cpython
我正在学习 cpython 内部结构(尤其是 is
运算符)并在 ceval.c
中遇到了 IS_OP
的以下操作码实现
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;
根据我的理解,python 中的 is
运算符比较对象标识,在其他团队中,它会检查两个对象是否指向同一个对象。所以我的问题是,只有下面的代码足以检查 object identity?,为什么实际实现再次应用 exlcusive OR(^
) 和 oparg
?
int res = (left == right)
IS_OP
操作码用于is
和is not
。当 oparg
为 1
(对于 is not
)时,^oparg
翻转比较结果,而当它为 0
(对于 is
), 因此相同的字节码可以通过调整 oparg
无分支地处理这两种情况(在 dis
输出中,is
是 IS_OP 0
,is not
是 IS_OP 1
).
我正在学习 cpython 内部结构(尤其是 is
运算符)并在 ceval.c
IS_OP
的以下操作码实现
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;
根据我的理解,python 中的 is
运算符比较对象标识,在其他团队中,它会检查两个对象是否指向同一个对象。所以我的问题是,只有下面的代码足以检查 object identity?,为什么实际实现再次应用 exlcusive OR(^
) 和 oparg
?
int res = (left == right)
IS_OP
操作码用于is
和is not
。当 oparg
为 1
(对于 is not
)时,^oparg
翻转比较结果,而当它为 0
(对于 is
), 因此相同的字节码可以通过调整 oparg
无分支地处理这两种情况(在 dis
输出中,is
是 IS_OP 0
,is not
是 IS_OP 1
).