CPython中處理is與is not語句示例詳解
起步
文檔中 https://docs.python.org/3.8/r... 表示對于 x is y 當且僅當兩個變量指向同一對象時才為真。對象可以通過 id() 函數來查看它的身份(id() 函數返回了對象在內存中的映射)。
is 與 is not 的字節(jié)碼
is 與 is not 都是操作符。 is not 是整體的,千萬別把 x is not y 當做是 x is (not y) 。
來看看這兩個操作符對應的字節(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 對應的動作
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() 函數中,僅通過對比兩個指針的值是否相等來判斷它們是否是指向同一對象。
純Python代碼解釋
通過 id() 函數可以來判斷某一對象在內存中對應的地址,因此用它也可以來判斷兩個變量是否指向了同一對象:
def _is(a, b):
return id(a) == id(b)
def _is_not(a, b):
return id(a) != id(b)以上就是CPython中處理is與is not語句示例詳解的詳細內容,更多關于CPython處理is is not語句的資料請關注腳本之家其它相關文章!
相關文章
使用Python Tkinter創(chuàng)建一個動態(tài)祝福彈窗的詳細教程
本文手把手教你用Python的Tkinter庫創(chuàng)建一個浪漫的彈窗程序,包含淡入淡出動畫、多線程管理、隊列控制等高級特性,通過完整的代碼解析和配置指南,帶你掌握GUI編程的核心技巧,需要的朋友可以參考下2025-11-11
Python3使用requests模塊實現顯示下載進度的方法詳解
這篇文章主要介紹了Python3使用requests模塊實現顯示下載進度的方法,結合實例形式分析了Python3中requests模塊的配置、使用及顯示進度條類的相關定義方法,需要的朋友可以參考下2019-02-02
對python中數組的del,remove,pop區(qū)別詳解
今天小編就為大家分享一篇對python中數組的del,remove,pop區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
在Python的列表中利用remove()方法刪除元素的教程
這篇文章主要介紹了在Python的列表中利用remove()方法刪除元素的教程,是Python入門中的基礎知識,注意其和pop()方法的區(qū)別,需要的朋友可以參考下2015-05-05

