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

