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-09
Python3.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-05
Python實(shí)現(xiàn)合并多個(gè)Excel文件中的指定sheet
這篇文章主要為大家介紹了一個(gè)用于合并多個(gè)Excel文件中指定sheet的Python代碼,這個(gè)功能可以方便地整理和分析數(shù)據(jù),文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考下2023-10-10
用Python每天自動(dòng)給女友免費(fèi)發(fā)短信
大家好,本篇文章主要講的是用Python每天自動(dòng)給女友免費(fèi)發(fā)短信,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式
這篇文章主要介紹了pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python的numpy模塊實(shí)現(xiàn)邏輯回歸模型
這篇文章主要為大家詳細(xì)介紹了python的numpy模塊實(shí)現(xiàn)邏輯回歸模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

