CPython中處理is與is not語句示例詳解
起步
文檔中 https://docs.python.org/3.8/r... 表示對(duì)于 x is y
當(dāng)且僅當(dāng)兩個(gè)變量指向同一對(duì)象時(shí)才為真。對(duì)象可以通過 id()
函數(shù)來查看它的身份(id()
函數(shù)返回了對(duì)象在內(nèi)存中的映射)。
is 與 is not 的字節(jié)碼
is
與 is not
都是操作符。 is not
是整體的,千萬別把 x is not y
當(dāng)做是 x is (not y)
。
來看看這兩個(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ù)從棧中取出,通過 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ù)中,僅通過對(duì)比兩個(gè)指針的值是否相等來判斷它們是否是指向同一對(duì)象。
純Python代碼解釋
通過 id()
函數(shù)可以來判斷某一對(duì)象在內(nèi)存中對(duì)應(yīng)的地址,因此用它也可以來判斷兩個(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語句示例詳解的詳細(xì)內(nèi)容,更多關(guān)于CPython處理is is not語句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python利用Appium實(shí)現(xiàn)自動(dòng)控制移動(dòng)設(shè)備并提取數(shù)據(jù)功能
這篇文章主要介紹了python利用Appium自動(dòng)控制移動(dòng)設(shè)備并提取數(shù)據(jù),本文以控制抖音app滑動(dòng)并獲取抖音短視頻發(fā)布者為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09Python3.6連接Oracle數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Python3.6連接Oracle數(shù)據(jù)庫的方法,較為詳細(xì)的分析了cx_Oracle模塊安裝及Python3.6使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-05-05Python實(shí)現(xiàn)合并多個(gè)Excel文件中的指定sheet
這篇文章主要為大家介紹了一個(gè)用于合并多個(gè)Excel文件中指定sheet的Python代碼,這個(gè)功能可以方便地整理和分析數(shù)據(jù),文中的示例代碼簡潔易懂,需要的可以參考下2023-10-10用Python每天自動(dòng)給女友免費(fèi)發(fā)短信
大家好,本篇文章主要講的是用Python每天自動(dòng)給女友免費(fèi)發(fā)短信,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式
這篇文章主要介紹了pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python的numpy模塊實(shí)現(xiàn)邏輯回歸模型
這篇文章主要為大家詳細(xì)介紹了python的numpy模塊實(shí)現(xiàn)邏輯回歸模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07