文档中 https://docs.python.org/3.8/r... 表示对于 x is y
当且仅当两个变量指向同一对象时才为真。对象可以通过 id()
函数来查看它的身份(id()
函数返回了对象在内存中的映射)。
is
与 is not
都是操作符。 is not
是整体的,千万别把 x is not y
当做是 x is (not y)
。
来看看这两个操作符对应的字节码(基于 Python 3.8):
>>> def fun():
... x is y
... x is not y
...
>>> import dis
>>> dis.dis(fun)
2 0 LOAD_GLOBAL 0 (x)
2 LOAD_GLOBAL 1 (y)
4 COMPARE_OP 8 (is)
6 POP_TOP
3 8 LOAD_GLOBAL 0 (x)
10 LOAD_GLOBAL 1 (y)
12 COMPARE_OP 9 (is not)
14 POP_TOP
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
>>>
对于 COMPARE_OP
对应的动作
case TARGET(COMPARE_OP): {
PyObject *right = POP();
PyObject *left = TOP();
PyObject *res = cmp_outcome(tstate, oparg, left, right);
Py_DECREF(left);
Py_DECREF(right);
SET_TOP(res);
if (res == NULL)
goto error;
PREDICT(POP_JUMP_IF_FALSE);
PREDICT(POP_JUMP_IF_TRUE);
DISPATCH();
}
这部分的代码的含义是先将代对比的两个操作数从栈中取出,通过 cmp_outcome(tstate, oparg, left, right)
得到两数的操作结果,再将结果 res
放入栈顶。
cmp_outcome
函数的相关代码是:
static PyObject *
cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
{
int res = 0;
switch (op) {
case PyCmp_IS:
res = (v == w);
break;
case PyCmp_IS_NOT:
res = (v != w);
break;
...
}
v = res ? Py_True : Py_False;
Py_INCREF(v);
return v;
}
在 cmp_outcome()
函数中,仅通过对比两个指针的值是否相等来判断它们是否是指向同一对象。
通过 id()
函数可以来判断某一对象在内存中对应的地址,因此用它也可以来判断两个变量是否指向了同一对象:
def _is(a, b):
return id(a) == id(b)
def _is_not(a, b):
return id(a) != id(b)
一、作用 离线浏览 - 根据文件规则把资源缓存在本地,脱机依然能够访问资源,联...
作者 / Krish Vitaldevara,Google Play 信任与安全产品管理总监 多年来,向数十...
行高line-height实现单行文本垂直居中 以前一直认为单行文本垂直居中要将高度和...
CSS3实现酷炫的3D旋转透视 3D动画效果现在越来越普及,已经被广泛的应用到了各个...
Dreamweaver中如何使用Flash影片 1、首先需要我们准备的是一个Flash文件,其次最...
在ie下设置 css 样式 style="cursor:hand;" 可以正常显示 但是在firefox下就不行...
最近在做项目时,发现CSS3中关于动画的技术,自己很少运用在项目中,平时一些列...
背景 京东购物小程序作为京东小程序业务流量的主要入口,承载着许多的活动和页面...
打开软件,我们按快捷键ctrl+n,建立一个新的文件。 点击常用,选择布局。 点击...
在讲CSS优先级之前,我们得要了解什么是CSS,CSS是用来做什么的。 首先,我们对C...