CPython中處理is與is not語(yǔ)句示例詳解
起步
文檔中 https://docs.python.org/3.8/r... 表示對(duì)于 x is y 當(dāng)且僅當(dāng)兩個(gè)變量指向同一對(duì)象時(shí)才為真。對(duì)象可以通過(guò) id() 函數(shù)來(lái)查看它的身份(id() 函數(shù)返回了對(duì)象在內(nèi)存中的映射)。
is 與 is not 的字節(jié)碼
is 與 is not 都是操作符。 is not 是整體的,千萬(wàn)別把 x is not y 當(dāng)做是 x is (not y) 。
來(lái)看看這兩個(gè)操作符對(duì)應(yīng)的字節(jié)碼(基于 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
>>>對(duì)于 COMPARE_OP 對(duì)應(yīng)的動(dòng)作
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();
}這部分的代碼的含義是先將代對(duì)比的兩個(gè)操作數(shù)從棧中取出,通過(guò) cmp_outcome(tstate, oparg, left, right) 得到兩數(shù)的操作結(jié)果,再將結(jié)果 res 放入棧頂。
cmp_outcome 函數(shù)的相關(guān)代碼是:
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() 函數(shù)中,僅通過(guò)對(duì)比兩個(gè)指針的值是否相等來(lái)判斷它們是否是指向同一對(duì)象。
純Python代碼解釋
通過(guò) id() 函數(shù)可以來(lái)判斷某一對(duì)象在內(nèi)存中對(duì)應(yīng)的地址,因此用它也可以來(lái)判斷兩個(gè)變量是否指向了同一對(duì)象:
def _is(a, b):
return id(a) == id(b)
def _is_not(a, b):
return id(a) != id(b)以上就是CPython中處理is與is not語(yǔ)句示例詳解的詳細(xì)內(nèi)容,更多關(guān)于CPython處理is is not語(yǔ)句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python opencv實(shí)現(xiàn)旋轉(zhuǎn)矩形框裁減功能
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)旋轉(zhuǎn)矩形框裁減功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
關(guān)于Python 實(shí)現(xiàn)tuple和list的轉(zhuǎn)換問(wèn)題
這篇文章主要介紹了Python 實(shí)現(xiàn)tuple和list的轉(zhuǎn)換,文中介紹了list(列表)和tuple(元組)共同點(diǎn)和區(qū)別,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
使用python分析統(tǒng)計(jì)自己微信朋友的信息
這篇文章主要介紹了python分析統(tǒng)計(jì)自己微信朋友的信息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
使用Python Tkinter創(chuàng)建一個(gè)動(dòng)態(tài)祝福彈窗的詳細(xì)教程
本文手把手教你用Python的Tkinter庫(kù)創(chuàng)建一個(gè)浪漫的彈窗程序,包含淡入淡出動(dòng)畫(huà)、多線(xiàn)程管理、隊(duì)列控制等高級(jí)特性,通過(guò)完整的代碼解析和配置指南,帶你掌握GUI編程的核心技巧,需要的朋友可以參考下2025-11-11
Python3使用requests模塊實(shí)現(xiàn)顯示下載進(jìn)度的方法詳解
這篇文章主要介紹了Python3使用requests模塊實(shí)現(xiàn)顯示下載進(jìn)度的方法,結(jié)合實(shí)例形式分析了Python3中requests模塊的配置、使用及顯示進(jìn)度條類(lèi)的相關(guān)定義方法,需要的朋友可以參考下2019-02-02
用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程
這篇文章主要介紹了用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程,需要的朋友可以參考下2015-04-04
對(duì)python中數(shù)組的del,remove,pop區(qū)別詳解
今天小編就為大家分享一篇對(duì)python中數(shù)組的del,remove,pop區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
在Python的列表中利用remove()方法刪除元素的教程
這篇文章主要介紹了在Python的列表中利用remove()方法刪除元素的教程,是Python入門(mén)中的基礎(chǔ)知識(shí),注意其和pop()方法的區(qū)別,需要的朋友可以參考下2015-05-05

