【问题标题】:What does the following code do in cpython以下代码在cpython中做了什么
【发布时间】:2021-03-20 21:25:40
【问题描述】:

我正在学习 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)

【问题讨论】:

    标签: python python-3.x cpython python-internals


    【解决方案1】:

    IS_OP 操作码用于isis not。当oparg1(对于is not)时,^oparg 翻转比较结果,并在它为0(对于is)时保持不变,因此相同的字节码可以无分支地处理这两种情况通过调整oparg(在dis 输出中,isIS_OP 0is notIS_OP 1)。

    【讨论】:

    • 哈,是的,我刚刚拆解了isis not。两者都有相同的操作码IS_OP,只有oparg 不同。谢谢你的回答。
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 2016-02-14
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-02-28
    相关资源
    最近更新 更多