精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節碼:分析 Python 執行的終極利器

開發 后端
Code Object(代碼對象)封裝了 Python 虛擬機的字節碼和虛擬機執行相關信息,可以把字節碼稱為 Python 虛擬機上的匯編語言。

 [[402321]]

本文轉載自微信公眾號「Python中文社區」,作者鞏慶奎。轉載本文請聯系Python中文社區公眾號。

一、什么是代碼對象

Code Object(代碼對象)封裝了 Python 虛擬機的字節碼和虛擬機執行相關信息,可以把字節碼稱為 Python 虛擬機上的匯編語言。

學代碼對象有什么用呢?從其定義可知,字節碼是編譯后的 Python 代碼,學習代碼對象有助于我們理解 Python 虛擬機、編譯過程、執行過程,更加深刻理解 Python 語言特性和疑難點。在解決一些疑難雜癥時,查看代碼對象的字節碼往往有事半功倍的效果。

二、探索代碼對象

Python 程序由代碼塊組成,代碼塊可以是模塊、函數或類,也可以是腳本文件,還可以是python - c 'string'和exec ('string')、eval ('string')中字符串的內容。

兩種方法:

  • fun.__code__ 獲取函數 fun 主體的代碼對象
  • compile('source code','','exec')獲取代碼塊 source code 的代碼對象

三、一個函數及其代碼對象

我們定義一個函數fun(a,b),它完成簡單的加法運算。

  1. def fun(a,b): 
  2.     return a+b  

來看它的代碼對象屬性情況,我們重點關注以 co_ 開頭的屬性。

  1. for attr in dir(fun.fun.__code__): 
  2.     if attr.startswith('co_'): 
  3.         print("{attr}:\t{attrs}".format( 
  4.             attrs=getattr(attr=attr,fun.fun.__code__, attr))) 

輸出為:

  1. co_argcount: 2 
  2. co_cellvars: () 
  3. co_code: b'|\x00|\x01\x17\x00S\x00' 
  4. co_consts: (None,) 
  5. co_filename: G:\pythonCodeStudy\manuscript\0 bytecode\fun.py 
  6. co_firstlineno: 1 
  7. co_flags: 67 
  8. co_freevars: () 
  9. co_kwonlyargcount: 0 
  10. co_lnotab: b'\x00\x01' 
  11. co_name: fun 
  12. co_names: () 
  13. co_nlocals: 2 
  14. co_posonlyargcount: 0 
  15. co_stacksize: 2 
  16. co_varnames: ('a''b'

fun 函數主體的代碼對象的屬性意義如下:

  • co_argcount 函數形式參數個數,這個只有函數類型代碼塊的代碼對象有,其它類型代碼塊沒有該屬性。
  • co_code 字節碼指令序列,字節碼都由操作碼 opcode 和參數 opatg 組成的序列。
  • co_const 常量列表,列表內容包括如下:
    • None 函數返回值,系統自帶。
    • 從前往后數所有字面常量:數字和字符串。
    • 內嵌函數代碼對象 code object。
    • 內嵌函數的 qual_name 常量,如:outer..inner。
  • co_name 本函數的名字。
  • co_varnames 本函數 局部變量 ,不含被引用自由變量,包含形式參數和內嵌函數名。
  • co_names 本函數用到的非局部變量,也就是 全局變量、系統內置變量。
  • co_nlocals 本函數的局部變量個數。
  • co_cellvars cell 變量。
  • co_freevars 自由變量。
  • co_flag 代碼對象的種類,比如協程、生成器等,其意義定義在 include/code.h 中。
  • co_lnotab 計算字節碼偏移量代表的源代碼行號的字節序列。兩個字節序列為一個單位,指示兩條源代碼指令編譯成的字節碼之間偏移多少。
  • co_stacksize 執行字節碼指令時,計算棧上最大的項目數,和函數參數個數有關。

Python虛擬機是基于棧的機器,每步函數調用產生棧幀(stack frame)。每個棧幀包含計算棧和塊棧。所有參數壓入計算棧,調用時彈棧,計算后彈出結果,結束本棧幀。

上例中,我們沒有詳細解釋 co_cellvars 和 co_freevars,下面詳細解釋。

3.1 co_cellvars 和 co_freevars

co_cellvars 和 co_freevars 是一個相對的概念。我們寫一個嵌套函數來解釋這兩個概念:函數 outer 中,定義了一個變量 e,被內部嵌套函數 inner 引用;inner 函數內部使用了變量 e,但是并未在該塊內定義之。

  1. def outer(o1, o2='o2'): 
  2.     e = 'enclose' 
  3.  
  4.     def inner(i1, i2='i2'): 
  5.         print(e) 
  6.         return e 
  7.     return inner 
  8. print(outer.__code__.co_cellvars) 
  9. print(outer('i1').__code__.co_freevars) 

結果。

  1. ('e',) 
  2. ('e',) 

故此,我們知道:

  • co_cellvars 是被內部嵌套塊(函數)引用的變量組成的元組。外部函數創建特殊的 cell 對象存儲該變量,cell 對象的生存周期超過了定義它的外部函數。這句話理解就是:外部變量執行完之后,清理現場,它的變量都消失了,但 cell 對象不消失,仍然存在。這也就是所謂 * cell 變量*
  • co_freevars 就塊內使用,但是并未在該塊內定義的變量(不含全局變量、內置變量)。也就是當前塊(函數) 引用的外部 cell 變量 組成的元組,和上個 co_cellvars 是相對的概念

這兩個是一體兩面的變量。

  • 外部變量 outer 作用域里,創建了變量 e 以及變量 inner (函數)。
  • 因為嵌套函數 inner 使用了外部變量 e ,所以在 outer 函數里, e 是作為 cell 變量,綁定到特殊的 cell 對象里。
  • 這個特殊的 cell 對象和 inner 綁定在了一起,這樣 outer 作用域消失的時候, inner 內部借由 cell 對象訪問到了 e 這個變量,它對 inner 函數來說是(來自 cell 對象的)自由變量。

掌握自由變量的概念,是編寫帶狀態函數、裝飾器的基礎。

四、字節碼細節

字節碼看起來就像亂碼,如上文 fun 函數的字節碼:co_code : b '|\ x00 |\ x01 \ x17 \ x00S \ x00 '。

根據上文,字節碼由一位操作碼和一位參數組成的序列。讓我們分析細節。

co_code [0]表示第一個操作碼|,這是 ASCII 碼 124 表示的字符,在 include/opcode.h 中,可以看到 124 是 LOAD_FAST 操作碼,這是對局部變量列表進行的加載操作。其它類似的:比如 LOAD_CONST 就是對字面常量列表操作,LOAD_GLOBAL 是對全局變量操作。

如果操作碼不帶參數,參數可以省略。這里的第一個操作碼的參數是 co_code[1] 為 0x00 。

因此,這個完整的字節碼操作是把局部變量列表 co_varnames 的第 0x00 索引內容 a ,壓入計算棧棧頂。

字節序列看起來比較費勁,讓我們用 dis.dis(fun)來反匯編代碼,得到字節碼如下。

  1. 2           0 LOAD_FAST                0 (a) 
  2.             2 LOAD_FAST                1 (b) 
  3.             4 BINARY_ADD 
  4.             6 RETURN_VALUE 

這樣看起來就很簡單了。

  • 第一列 2 表示源代碼的第二行,也就是return a+b這一條。
  • 第二列的 0 表示該條操作碼相對字節碼開頭的偏移量,LOAD_FAST 表示操作碼,0 表示參數,(a)是由 dis 生成的,即局部變量元組第 0 個元素 a。本條將變量 a 壓入計算棧。
  • 以此類推第二條,將局部變量 b 壓入計算棧。
  • 第三條 BINARY_ADD 沒有參數,它是求和,將 a 和 b 彈出,求和,結果壓入計算棧棧頂。
  • 第四條 RETURN_VALUE 彈出結果,結束本棧幀。

Python 編譯產生 pyc 文件:Python3 之前是在本地目錄產生,之后是在 pycache 目錄下。我們打開上例產生的 pyc 文件,使用十六進制查看,能明顯發現,編譯的字節碼就直接在 PYC 文件里。

五、其它代碼塊代碼對象

上例中,我們對函數進行反匯編,使用的是 dis.dis(fun)指令,這里的 fun 是函數。

第二部分說過得到代碼對象有兩種方法,當我們對其它代碼對象進行 compile 時,實際是對該模塊進行反編譯。如果此時該代碼塊里有函數,只會產生代碼對象,不會產生真正的函數對象。

比如如下語句:print(dis.dis(compile('def fun(a,b): return a+b', '', 'exec'))),輸出如下。可見此時的函數只是一個代碼對象,作為常量載入,MAKE_FUNCTION 后,賦值給 fun 局部變量。

  1. 1           0 LOAD_CONST               0 (<code object fun at 0x00A67B18, file 
  2. ", line 1>) 
  3.             2 LOAD_CONST               1 ('fun'
  4.             4 MAKE_FUNCTION            0 
  5.             6 STORE_NAME               0 (fun) 
  6.             8 LOAD_CONST               2 (None) 
  7.            10 RETURN_VALUE 

六、總結

代碼對象封裝了 Python 虛擬機的字節碼和其它編譯相關信息,可以把字節碼稱為 Python 虛擬機上的匯編語言。我們分析了自由變量和 cell 變量,掌握自由變量的概念,這是編寫裝飾器、帶狀態函數的基礎。字節碼由一位操作碼和一位參數組成的序列,學習其細節,有助于我們理解 Python 的特性。可在分析變量作用域、閉包時作為強大的工具。

作者:鞏慶奎,大奎,對計算機、電子信息工程感興趣。gongqingkui at 126.com

 

責任編輯:武曉燕 來源: Python中文社區
相關推薦

2024-04-12 07:50:40

Python監控利器Time 模塊

2024-03-14 08:19:14

PythonXmltodict第三方庫

2018-04-04 15:05:17

虛擬機字節碼引擎

2015-07-08 14:56:26

2023-11-09 12:59:00

微力同步數據傳輸工具

2024-10-21 10:45:52

2024-10-29 10:54:07

2025-06-24 07:35:20

2024-03-08 08:38:19

PythonJavaScriptexecjs庫

2011-12-01 14:56:30

Java字節碼

2021-09-10 14:05:14

預測分析大數據分析大數據

2019-10-30 08:45:21

JS代碼NodeJS

2024-04-30 09:33:00

JavaScriptPythonexecjs

2022-03-30 10:10:17

字節碼棧空間

2025-09-25 16:56:16

2024-10-20 13:28:47

虛擬機字節碼CPU

2013-09-05 09:37:49

2025-02-19 07:49:36

2025-05-09 08:08:47

點贊
收藏

51CTO技術棧公眾號

欧美片第1页| 亚洲AV无码国产精品午夜字幕| 国内精品久久久久久99蜜桃| 欧美日韩一区成人| 一级全黄肉体裸体全过程| 亚洲成a人片在线| 新狼窝色av性久久久久久| 中文字幕视频一区二区在线有码| 欧洲美女亚洲激情| ririsao久久精品一区| 久久视频一区二区| 亚洲一区制服诱惑| 无码人妻aⅴ一区二区三区有奶水| 91日韩欧美| 日韩黄色在线免费观看| 视色视频在线观看| www欧美xxxx| 国产精品日产欧美久久久久| 国产精品jizz视频| 中文字幕乱码人妻二区三区| 好看的av在线不卡观看| 亚洲性生活视频在线观看| 性鲍视频在线观看| 欧美在线va视频| 亚洲国产一区二区三区青草影视| 色姑娘综合网| 四虎永久在线观看| 国产综合久久久久久久久久久久| 91高清视频免费| 青青草原免费观看| 第一sis亚洲原创| 亚洲精品日韩丝袜精品| 国产乱国产乱老熟300部视频| 色猫猫成人app| 疯狂做受xxxx高潮欧美日本| 8x8x华人在线| 婷婷在线视频| 国产亚洲欧美日韩在线一区| 国产在线一区二区三区欧美| 国产极品久久久| 美女精品一区二区| 日韩av快播网址| 天天操天天爽天天干| 欧美激情综合色综合啪啪| 中文字幕日韩视频| 国产熟女一区二区| 美女毛片一区二区三区四区| 亚洲第一区中文字幕| 亚洲无在线观看| 日韩黄色在线| 欧美日韩aaaaaa| 亚洲国产精品三区| 国产精品字幕| 欧美性xxxxxxxx| 国产一级不卡毛片| 欧美大片免费高清观看| 欧美日韩加勒比精品一区| 国产爆乳无码一区二区麻豆| 色黄网站在线观看| 一区二区三区高清| 成年在线观看视频| 三级资源在线| 尤物在线观看一区| 国产精品一色哟哟| 波多野一区二区| 懂色aⅴ精品一区二区三区蜜月| 日本网站免费在线观看| 九色porny视频在线观看| 五月天亚洲精品| 男人用嘴添女人下身免费视频| 99热99re6国产在线播放| 午夜视频在线观看一区| 国产免费黄色小视频| 欧美激情网站| 91久久国产最好的精华液| 久久久久久久片| 日本一区二区中文字幕| 4438成人网| 亚洲美女精品视频| 啪啪激情综合网| 亚洲午夜小视频| 999精品久久久| 中文视频一区| 午夜精品一区二区三区在线视| 久草手机在线视频| 美女网站一区二区| 99国产视频在线| 天堂av电影在线观看| 国产日本欧洲亚洲| 日本黄色播放器| 91豆花视频在线播放| 色网站国产精品| 天天做天天干天天操| 成人性生交大片免费看96| 日韩国产精品亚洲а∨天堂免| 久久只有这里有精品| 99精品视频精品精品视频| 欧美激情亚洲国产| 一级黄色大片视频| 国产一区二区三区四区五区入口 | 日韩欧美一区电影| 91传媒理伦片在线观看| 蜜桃a∨噜噜一区二区三区| 深夜福利日韩在线看| 久久精品国产av一区二区三区| 老司机一区二区三区| 成人精品一区二区三区电影免费 | 亚洲娇小xxxx欧美娇小| 国产又粗又猛又爽视频| 亚洲色图二区| 国产成人一区三区| 亚洲国产精品久久久久久久| 国产日韩欧美一区二区三区综合| 97免费视频观看| jizz免费一区二区三区| 亚洲а∨天堂久久精品9966| www色com| 亚洲一区亚洲| 99在线观看视频| 亚洲v国产v| 中文字幕人妻熟女在线| 国产一区二区观看| 久久99久国产精品黄毛片入口| 国产精品午夜影院| 国产成人精品免费| 亚洲图片欧洲图片日韩av| 蜜桃麻豆影像在线观看| 欧美高清dvd| 香蕉影视欧美成人| 一道精品一区二区三区| 美女搞黄视频在线观看| 337p亚洲精品色噜噜噜| 中文字幕免费视频| 一本久久综合| 国产精品久久久一区二区三区| av网页在线| 色综合久久天天| 波多野结衣有码| 欧美特黄一区| 91国产在线播放| 国产在线高清视频| 欧美精品777| www中文在线| 欧美a级理论片| 手机看片福利永久国产日韩| 欧美亚洲韩国| 亚洲女人天堂视频| 国产精品老女人| 99精品国产热久久91蜜凸| 被灌满精子的波多野结衣| 玖玖玖视频精品| 久久亚洲精品小早川怜子66| 亚洲网站在线免费观看| 国产精品三级在线观看| 自拍偷拍一区二区三区四区| 成人羞羞网站入口免费| 国产精品久久久久国产a级| 高清在线观看av| 欧美性高清videossexo| 免费91在线观看| 九一久久久久久| 18视频在线观看娇喘| 成人短视频软件网站大全app| 日韩有码在线视频| 国产欧美第一页| 日韩一区欧美小说| 少妇性l交大片7724com| 欧美视频久久| 国内视频一区| 久久uomeier| 一区二区三区四区视频| 国产精品国产av| 亚洲精品免费电影| 久久性爱视频网站| 亚洲一区久久| 先锋影音网一区| 欧美激情精品| 91国内在线视频| 国产美女性感在线观看懂色av | 亚洲色图狂野欧美| 国产成人自拍偷拍| 亚洲色图在线看| 中文字幕18页| 日韩精品国产欧美| eeuss中文| 久9re热视频这里只有精品| 国产91成人video| av影片在线看| 精品国产一区二区三区忘忧草| 国产精品100| 国产精品电影一区二区| 男人添女人荫蒂国产| 亚洲视频1区| 亚洲一二三区在线| 久久99精品国产自在现线| 日韩av免费在线| www久久日com| 亚洲天堂视频在线观看| 国产欧美日韩综合精品一区二区三区 | 极品少妇一区二区三区| 蜜桃999成人看片在线观看| 国产美女精品视频免费播放软件| 91精品国产99| 成人日韩欧美| 亚洲欧美色图片| 国产99久久九九精品无码免费| 欧美性猛交xxxx乱大交3| 欧美一区免费观看| 久久亚洲综合色一区二区三区| 日韩欧美中文在线视频| 老司机免费视频久久| 久久久久久av无码免费网站下载| 国产欧美日韩精品一区二区三区| www.一区二区三区| 国产成人午夜性a一级毛片| 66m—66摸成人免费视频| 麻豆视频在线| 亚洲人成在线电影| 日本韩国在线观看| 91麻豆精品国产| 国产精品露脸视频| 福利视频第一区| 久久久久久久国产精品毛片| 国产精品美女一区二区在线观看| 中国黄色a级片| 成人国产精品免费网站| 天天久久综合网| 麻豆专区一区二区三区四区五区| 少妇无码av无码专区在线观看 | 亚洲欧美日本国产| 国产精品稀缺呦系列在线| 欧美aa在线观看| 久久久亚洲天堂| av网站免费在线观看| 中文字幕日本精品| 猫咪在线永久网站| 国产丝袜一区视频在线观看| 国内爆初菊对白视频| 91精品国产一区二区三区蜜臀| 免费黄色一级大片| 一本色道久久综合亚洲91| 啦啦啦免费高清视频在线观看| 亚洲午夜成aⅴ人片| 久久久久久久久毛片| 亚洲日本电影在线| 亚洲天堂一级片| 综合在线观看色| 国产大片免费看| 亚洲欧美另类小说| 国产精品 欧美激情| 亚洲欧洲综合另类在线| 日本一二三区在线观看| 亚洲欧美一区二区三区极速播放 | 国产999在线| 极品美女一区| 日本在线观看天堂男亚洲| 在线男人天堂| 日韩av日韩在线观看| 日韩三区在线| 国产日韩欧美在线视频观看| 粉嫩av一区二区三区四区五区| 国产精品视频99| 祥仔av免费一区二区三区四区| 国产日韩在线播放| 不卡的国产精品| 亚洲自拍小视频| av综合网站| 久久久com| 成人区精品一区二区婷婷| 一区二区三区四区不卡| 亚洲综合中文| 成年人网站国产| 久久精品毛片| gogogo高清免费观看在线视频| 国产乱码精品一区二区三区忘忧草 | 欧美videossexotv100| 黄频在线免费观看| 亚洲女人被黑人巨大进入al| 中文字幕在线观看日本| 欧美成aaa人片免费看| xxx.xxx欧美| 国产精品高潮呻吟久久av无限| 日韩欧国产精品一区综合无码| 99国产在线视频| 曰本一区二区三区视频| 亚洲一区二区三区精品动漫| 欧美久久九九| 欧美视频第一区| 激情综合色丁香一区二区| 美国黄色一级视频| 国产无一区二区| 亚洲一级生活片| 精品欧美aⅴ在线网站| 中日韩在线观看视频| 日韩欧美国产精品| 日韩porn| 九九热最新视频//这里只有精品 | 亚洲国产一区二区在线观看| 91九色丨porny丨国产jk| 日韩av中文字幕一区二区 | 美国十次综合久久| 免费一区二区三区| 欧美日韩p片| 亚洲福利精品视频| 成人精品高清在线| av最新在线观看| 欧美网站在线观看| 国产三级小视频| 一区二区三区天堂av| 1024在线看片你懂得| 国产欧美 在线欧美| 九色丨蝌蚪丨成人| 欧美交换配乱吟粗大25p| 日本成人在线视频网站| 亚州av综合色区无码一区| 亚洲欧美精品午睡沙发| 伊人久久久久久久久久久久| 精品欧美乱码久久久久久1区2区| 大片免费播放在线视频| 69久久夜色精品国产7777| 亚洲一区有码| 亚洲v国产v在线观看| 免费亚洲婷婷| 一本色道久久hezyo无码| 亚洲欧美日韩小说| 正在播放木下凛凛xv99| 亚洲精品日韩久久久| 国产99re66在线视频| 亚洲va欧美va国产综合久久| 欧美精品一区二区三区中文字幕 | 国产美女高潮在线| 999国内精品视频在线| 91精品综合久久久久久久久久久| 成人免费毛片播放| www久久精品| 福利一区二区三区四区| 日韩欧美一级二级三级| 黄网站免费在线播放| 国产精品久久av| 欧美日韩爱爱| 欧美成人xxxxx| 99久久国产免费看| 亚洲另类欧美日韩| 亚洲国产精品国自产拍av秋霞| 图片区小说区亚洲| 91免费版网站在线观看| 影音先锋成人在线电影| 亚洲无在线观看| 亚洲柠檬福利资源导航| 国产婷婷一区二区三区久久| 久久久成人精品视频| 国产精久久一区二区| 国产树林野战在线播放| 精品一区二区国语对白| 国产成人av免费在线观看| 91麻豆精品国产91久久久久久| 在线观看wwwxxxx| 999热视频在线观看| 影院欧美亚洲| 韩国无码一区二区三区精品| 精品magnet| 天堂中文在线观看视频| 日本亚洲欧美三级| 国产亚洲一区| 天天操,天天操| 亚洲婷婷国产精品电影人久久| 国产喷水福利在线视频| 欧美激情视频一区二区| 久久免费视频66| 国产成人久久婷婷精品流白浆| 国产网站一区二区三区| 中文字幕永久免费视频| 久久色精品视频| 51亚洲精品| 成人黄色片视频| 中文乱码免费一区二区| 国产激情久久久久久熟女老人av| 欧美激情图片区| 久久99国产精品视频| 午夜久久福利视频| 亚洲国产精品久久久男人的天堂 | 91免费国产精品| 91日韩一区二区三区| 黄色一区二区视频| 欧美国产一区二区三区| 中文字幕亚洲影视| 99视频在线观看视频| 午夜精品视频一区| 1区2区3区在线观看| 高清国产一区| 久久都是精品| 国产日韩欧美在线观看视频| 欧美精品一区二区三区在线| 免费观看成人性生生活片| 在线视频一二三区| 久久精品一区蜜桃臀影院| 999av视频| 97视频在线观看免费| 99国产精品免费视频观看| 一边摸一边做爽的视频17国产|