初学者文档https://docs.python.org/3.8/r...意味着当且仅当两个变量指向同一对象时xisy为真。一个对象可以通过id()函数看到它的身份(id()函数返回对象在内存中的映射)。is和is的字节码Bothis和isnot都是运算符。isnotisnotisintegral,不要把xisnoty当作xis(noty)。我们来看看这两个操作符对应的字节码(基于Python3.8):>>>deffun():...xisy...xisnoty...>>>importdis>>>dis.dis(fun)20LOAD_GLOBAL0(x)2LOAD_GLOBAL1(y)4COMPARE_OP8(is)6POP_TOP38LOAD_GLOBAL0(x)10LOAD_GLOBAL1(y)12COMPARE_OP9(isnot)14POP_TOP16LOAD_CONST0(None)18RETURN_VALUE>>>ForCOMPARE_OP相应的动作案例TARGET(COMPARE_OP):{PyObject*right=POP();PyObject*left=TOP();PyObject*res=cmp_outcome(tstate,oparg,left,right);Py_DECREF(左);Py_DECREF(右);SET_TOP(资源);如果(res==NULL)转到错误;预测(POP_JUMP_IF_FALSE);预测(POP_JUMP_IF_TRUE);DISPATCH();}这部分代码的意思是先从栈中取出生成比较的两个操作数,通过cmp_outcome(tstate,oparg,left,right)得到两个数对结果进行操作,然后将结果res放入栈顶。cmp_outcome函数的相关代码为:staticPyObject*cmp_outcome(PyThreadState*tstate,intop,PyObject*v,PyObject*w){intres=0;switch(op){casePyCmp_IS:res=(v==w);休息;案例PyCmp_IS_NOT:res=(v!=w);休息;...}v=水库?Py_True:Py_False;Py_INCREF(v);returnv;}在cmp_outcome()函数中,只是通过比较两个指针的值来判断它们是否指向同一个对象。纯Python代码讲解使用id()函数来判断一个对象在内存中对应的地址,所以也可以用来判断两个变量是否指向同一个对象:def_is(a,b):returnid(a)==id(b)def_is_not(a,b):返回id(a)!=id(b)
