Python 字節碼指令 LOAD_DEREF

LOAD_DEREF 是 Python 字節碼指令,它與閉包和嵌套函數有關。要理解 LOAD_DEREF,我們首先需要了解 Python 中的幾個概念:cellfree variable 和閉包。

  1. Cell 和 Free Variables:
    當一個嵌套函數引用了其上級作用域中的一個變量,但該變量并不是全局的或局部的,那么這個變量就被稱為 free variablecell 是一個內部機制,用于存儲這些 free variables,使嵌套函數可以訪問它們,即使上級函數已經退出。

  2. 閉包 (Closure):
    在 Python 中,函數是一等對象,這意味著它們可以作為參數傳遞,可以返回,可以定義在另一個函數內部等。當內部函數引用了外部函數的變量時,我們得到了一個閉包。閉包捕獲并保存了外部函數的 free variables,使得這些變量即使在外部函數結束后仍然可以被訪問。

LOAD_DEREF 指令就是在閉包中使用的,用于加載從一個 cellfree variable 中的值到棧上。具體來說,它用于加載由 cell 或嵌套函數作用域中的局部變量表示的值。

讓我們看一個簡單的示例:

def outer(x):def inner():return xreturn innerfunc = outer(10)
print(func())  # 輸出: 10

在上述示例中,inner 函數是一個閉包,因為它引用了外部函數 outer 的變量 x。當我們調用 outer 并返回 inner 時,變量 x 的值仍然被保存下來,這就是通過 cell 機制實現的。當 inner 函數執行并嘗試訪問 x 時,就會使用 LOAD_DEREF 指令。

如果你查看 inner 函數的字節碼,你會看到 LOAD_DEREF 指令。這可以通過以下方式完成:

import dis
dis.dis(func)

在如下輸出中,我們看到 LOAD_DEREF 指令,表示它正在從一個 cellfree variable 加載一個值。

  6           0 LOAD_DEREF               0 (x)2 RETURN_VALUE

接下來,讓我們看看 free variablecell 的例子。

  1. Free Variable:

    free variable 是一個在嵌套函數內部被引用,但不是這個嵌套函數的局部變量,也不是全局變量的變量。在以下示例中,x 就是一個 free variable 對于 inner 函數來說。

    def outer():x = 10  # 這里的 x 就是一個 free variable 對于 inner 來說def inner():print(x)  # x 在這里被引用,但它既不是 inner 的局部變量,也不是一個全局變量inner()outer()  # 輸出: 10
    
  2. Cell:

    當我們談論閉包時,Python 使用 cell 對象來實現這個特性。這是因為,盡管上層函數已經執行完畢并退出了,但嵌套的函數依然可以訪問上層函數的變量。這就是通過將這些變量保存在 cell 對象中來實現的。

    在以下示例中,我們創建了一個閉包,然后使用 __closure__ 屬性來查看這些 cell 對象:

    def outer(x):def inner():return xreturn innerclosure_function = outer(25)
    print(closure_function())  # 輸出: 25# 查看 closure_function 的 cell 對象
    cell = closure_function.__closure__[0]
    print(cell.cell_contents)  # 輸出: 25
    

    cell 對象有一個屬性 cell_contents,它保存了閉包中被引用的變量的當前值。在上面的例子中,cell.cell_contents 的值是 25,這是我們傳遞給 outer 函數的值。

    【注】:print(closure_function._ _closure _ _) 的輸出為 (<cell at 0x00000223E8C3A6B0: int object at 0x00000223E8AD03F0>,)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40809.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40809.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大數據Hive】hive 事務表使用詳解

目錄 一、前言 二、Hive事務背景知識 hive事務實現原理 hive事務原理之 —— delta文件夾命名格式 _orc_acid_version 說明 bucket_00000 合并器(Compactor) 二、Hive事務使用限制 參數設置 客戶端參數設置 客戶端參數設置 三、Hive事務使用操作演示 操作步驟 客…

(已解決)redis.get報錯com.alibaba.fastjson.JSONException: autoType is not support

redis存取值問題&#xff0c;存自定義實體對象&#xff1b; 第一次取的時候報錯&#xff1a;com.alibaba.fastjson.JSONException: autoType is not support。 GenericFastJsonRedisSerializer序列化和反序列化redis的value值&#xff0c;需要bean對象含有無參構造方法。 解決…

【C語言】回調函數,qsort排序函數的使用和自己實現,超詳解

文章目錄 前言一、回調函數是什么二、回調函數的使用1.使用標準庫中的qsort函數2.利用qsort函數對結構體數組進行排序 三、實現qsort函數總結 先記錄一下訪問量突破2000啦&#xff0c;謝謝大家支持&#xff01;&#xff01;&#xff01; 這里是上期指針進階鏈接&#xff0c;方便…

金融術語總結

洗錢 將犯罪或其他非法違法行為所獲得的違法收入&#xff0c;通過各種手段掩飾、隱瞞、轉化&#xff0c;使其在形式上合法化的行為。 存量客戶 某個時間段里原先已有的客戶,與新增客戶相對應。 月活躍用戶數量&#xff0c;MAU&#xff08;Monthly Active User&#xff0c;M…

【go語言基礎】go中的方法

先思考一個問題&#xff0c;什么是方法&#xff0c;什么是函數&#xff1f; 方法是從屬于某個結構體或者非結構體的。在func這個關鍵字和方法名中間加了一個特殊的接收器類型&#xff0c;這個接收器可以是結構體類型的或者是非結構體類型的。從屬的結構體獲取該方法。 函數則…

【100天精通python】Day37:GUI界面編程_PyQT從入門到實戰(上)

目錄 專欄導讀 1 PyQt6 簡介&#xff1a; 1.1 安裝 PyQt6 和相關工具&#xff1a; 1.2 PyQt6 基礎知識&#xff1a; 1.2.1 Qt 的基本概念和組件&#xff1a; 1.2.2 創建和使用 Qt 窗口、標簽、按鈕等基本組件 1.2.3 布局管理器&#xff1a;垂直布局、水平布局、網格布局…

typedef函數代碼段解釋以及部分Windows下的系統函數

文章目錄 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress運行時獲取一個動態鏈接庫&#xff08;DLL&#xff09;中…

mysql與redis區別

mysql和redis的數據庫類型 mysql是關系型數據庫&#xff0c;主要用于存放持久化數據&#xff0c;將數據存儲在硬盤中&#xff0c;讀取速度較慢。 redis是NOSQL&#xff0c;即非關系型數據庫&#xff0c;也是緩存數據庫&#xff0c;即將數據存儲在緩存中&#xff0c;緩存的讀取速…

網絡

mcq Java 傳輸層&#xff1a;拆分和組裝&#xff0c;完成端到端的消息傳遞&#xff0c;流量控制&#xff0c;差錯控制等 網絡層&#xff1a; 尋址、路由&#xff0c;復用&#xff0c;擁塞控制&#xff0c;完成源到宿的傳遞。 顯然A選項是錯誤的&#xff0c;有流量控制的是傳輸層…

JavaScript TypeScript

文章目錄 JavaScript語法事件處理與HTML和CSS集成前端框架和庫 TypeScript靜態類型檢查語法更好的可維護性 包管理工具npmpnpmyarnBower JavaScript JavaScript&#xff08;簡稱JS&#xff09;是一種廣泛應用于網頁開發的腳本語言。它被用來為網頁增加交互性和動態功能。以下是…

netty學習分享(一)

TCP與UDP TCP 是面向連接的、可靠的流協議&#xff0c;通過三次握手建立連接&#xff0c;通訊完成時要拆除連接。 UDP是面向無連接的通訊協議&#xff0c;UDP通訊時不需要接收方確認&#xff0c;屬于不可靠的傳輸&#xff0c;可能會出現丟包現象 端口號&#xff1a; 端口號用…

【微信小程序】記一次自定義微信小程序組件的思路

最近來個需求&#xff0c;要求給小程序的 modal 增加個關閉按鈕&#xff0c;上網一查發現原來 2018 年就有人給出解決方案了&#xff0c;于是總結下微信小程序自定義組件的思路&#xff1a;一句話&#xff0c;用 wxml css實現和原生組件類似的樣式和效果&#xff0c;之后用 JS…

【uniapp】uniapp設置安全區域:

文章目錄 一、效果圖:二、實現代碼: 一、效果圖: 二、實現代碼: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息隊列學習筆記

消息隊列基礎 適合消息隊列解決的問題 異步處理&#xff1a;處理完關鍵步驟后直接返回結果&#xff0c;后續放入隊列慢慢處理流量控制&#xff1a; 使用消息隊列隔離網關和后端服務&#xff0c;以達到流量控制和保護后端服務的目的。能根據下游的處理能力自動調節流量&#x…

leetcode做題筆記79單詞搜索

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相鄰或垂直相…

Matlab工具NIFTI包的基本功能函數

Matlab工具NIFTI包的基本功能函數 Nifti 格式最初是為神經影像學發明的。神經影像信息學技術計劃&#xff08;NIFTI&#xff09;將 NIfTI 格式預設為 ANALYZE7.5 格式的替代品。它最初的應用領域是神經影像&#xff0c;但是也被用在其他領域。這種格式的主要特點就是它包含兩個…

Docker基礎入門:常規軟件安裝與鏡像加載原理

Docker基礎入門&#xff1a;常規軟件安裝與鏡像加載原理 一、Docker常規軟件安裝1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->連接elasticsearch1.5、部署可視化工具 二、 鏡像加載原理2.1、鏡像是什么2.2、Docker鏡像加速原理2.3、分層理解…

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter&#xff0c;他的原理大概就是啟動一個kafka客戶端&#xff0c;獲取kafka服務器的信息&#xff0c;然后提供一些metric接口供Prometheus使用&#xff0c;隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…