摘要:有關版本下的模塊的使用事情源于昨天看書看到一個有意思的部分,就是在元組里面的元素如果存在可變的對象,比如里面的列表,類似下面這種形式那么如果我執行會發生什么,首先給我的感覺是這個會報錯吧,這個是顯而易見的,但是能否添加進去呢哈哈,突然覺得有
有關Python2.x版本下的dis模塊的使用
事情源于昨天看書看到一個有意思的部分,就是在Python元組里面的元素如果存在可變的對象,比如Python里面的列表,類似下面這種形式:
t = (1, 2, [3, 4])
那么如果我執行t[2] += [5, 6]會發生什么,首先給我的感覺是這個會報錯吧,這個是顯而易見的,但是5能否添加進去呢?哈哈,突然覺得有點意思了,然后答案就是:
t變成(1, 2, [3, 4, 5, 6]) 因為tuple不支持對它的賦值,所以會拋出TypeError異常
具體的報錯信息可以在交互式環境中自行測試一下
這個時候我們可以使用Python的dis模塊來反編譯一下,看看操作的字節碼,如下所示:
In [14]: dis.dis(compile("t[2]+=[5, 6]", " ", "single")) 1 0 LOAD_NAME 0 (t) 3 LOAD_CONST 0 (2) 6 DUP_TOPX 2 9 BINARY_SUBSCR 10 LOAD_CONST 1 (5) 13 LOAD_CONST 2 (6) 16 BUILD_LIST 2 19 INPLACE_ADD 20 ROT_THREE 21 STORE_SUBSCR 22 LOAD_CONST 3 (None) 25 RETURN_VALUE
因為我使用的是Python2的版本,所以在使用dis.dis的時候,我們需要先將代碼編譯一下,即使用compile方法,這里需要注意的是第三個參數,第三個參數有三個選項,"single"、"eval"、"exec",具體的可以help查看一下,下面我們來說一下上面字節碼的關鍵行的解釋:
BINARY_SUBSCR 表示將t[2]存入棧頂TOS INPLACE_ADD 表示計算 TOS+[5, 6],這一步是可以完成的,因為TOS指向的是一個可變對象,也就是[3, 4]這個列表 STORE_SUBSCR 這一步失敗,這是因為t是一個元組,是不可變的,對其元素進行賦值是不被允許的
所以我的建議是:
不要把可變對象放入元組里面
增量賦值不是一個原子操作,像上面的那樣,雖然拋出錯誤,但是還是完成了操作
了解Python代碼背后的運行機制很有幫助
不建議這樣,雖然我們可以使用t[2].extend([5, 6])來完成操作,但是我們仍然不建議這樣做,不要將可變對象放入元組中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41339.html
摘要:所以與多線程相比,線程的數量越多,協程性能的優勢越明顯。值得一提的是,在此過程中,只有一個線程在執行,因此這與多線程的概念是不一樣的。 真正有知識的人的成長過程,就像麥穗的成長過程:麥穗空的時候,麥子長得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時,它們開始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關于python多線程是否是雞肋的問題,得到了一些網友的認可,當然也有...
摘要:的三種數據類型字典列表元組,分別用花括號中括號小括號表示。約等于上句,可能是因為自定義變量名與內部函數或變量同名了。下,默認路徑一般為。的日志模塊中計時器定時器計劃任務,。對象的問題怎樣忽略警告不打印煩人的警告打印到終端同時記錄到文件。 Python Enhancement Proposal。(PEP,Python增強建議書) Python之禪(import this) Pytho...
摘要:想給裝一個的庫,結果搗鼓半天,倒給裝上了,而里則一直失敗。在網上搜到有答案說要安裝頭文件。把該解決方法套用過來,將安裝目錄下我的是的文件拷貝到安裝目錄下的目錄下我的是即可。拷貝過去,測試,成功,問題解決。 0 想給python3裝一個opencv的庫,結果搗鼓半天,倒給python2.x裝上cv2了,而python3里import cv2則一直失敗。 1 首先想到動態鏈接庫,于是添加/...
閱讀 1250·2023-04-26 01:38
閱讀 1462·2021-11-15 11:39
閱讀 3251·2021-09-22 15:43
閱讀 2638·2019-08-30 15:55
閱讀 2047·2019-08-30 14:17
閱讀 2851·2019-08-29 14:16
閱讀 3062·2019-08-26 18:36
閱讀 2607·2019-08-26 12:19