Python 對象引用、可變性和垃圾 回收(變量不是盒子)

變量不是盒子

1997 年夏天,我在 MIT 學了一門 Java 課程。Lynn Andrea Stein 教授
(一位獲獎的計算機科學教育工作者,目前在歐林工程學院教書)指
出,人們經常使用“變量是盒子”這樣的比喻,但是這有礙于理解面向對
象語言中的引用式變量。Python 變量類似于 Java 中的引用式變量,因此
最好把它們理解為附加在對象上的標注。

在示例 8-1 所示的交互式控制臺中,無法使用“變量是盒子”做解釋。圖
8-1 說明了在 Python 中為什么不能使用盒子比喻,而便利貼則指出了變
量的正確工作方式。

示例 8-1 變量 a 和 b 引用同一個列表,而不是那個列表的副本

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]

image
圖 8-1:如果把變量想象為盒子,那么無法解釋 Python 中的賦值;
應該把變量視作便利貼,這樣示例 8-1 中的行為就好解釋了

Stein 教授還反復講解了賦值方式。例如講到 seesaw 對象時,她會說“把
變量 s 分配給 seesaw”,絕不會說“把 seesaw 分配給變量 s”。對引用式
變量來說,說把變量分配給對象更合理,反過來說就有問題。畢竟,對
象在賦值之前就創建了。示例 8-2 證明賦值語句的右邊先執行。

示例 8-2 創建對象之后才會把變量分配給對象

>>> class Gizmo:
... def __init__(self):
... print('Gizmo id: %d' % id(self))
...
>>> x = Gizmo()
Gizmo id: 4301489152 ?
>>> y = Gizmo() * 10 ?
Gizmo id: 4301489432 ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'Gizmo' and 'int'
>>>
>>> dir() ?
['Gizmo', '__builtins__', '__doc__', '__loader__', '__name__',
'__package__', '__spec__', 'x']

? 輸出的 Gizmo id: … 是創建 Gizmo 實例的副作用。
? 在乘法運算中使用 Gizmo 實例會拋出異常。
? 這里表明,在嘗試求積之前其實會創建一個新的 Gizmo 實例。
? 但是,肯定不會創建變量 y,因為在對賦值語句的右邊進行求值時拋
出了異常。


為了理解 Python 中的賦值語句,應該始終先讀右邊。對象在
右邊創建或獲取,在此之后左邊的變量才會綁定到對象上,這就像
為對象貼上標注。忘掉盒子吧!

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

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

相關文章

局域網常用的測速工具,Iperf3使用教程

目錄 下載方式 Windows Linux 使用方法&#xff1a;測試局域網帶寬 步驟一&#xff1a;服務端準備 步驟二&#xff1a;客戶端發起連接 步驟三&#xff1a;查看結果 參數說明 1. Iperf常用參數&#xff08;測試夠用&#xff09; 2. 通用參數&#xff08;Server端和Cli…

《深入理解分布式系統》之認識分布式系統

本文是閱讀深入理解分布式系統第一章認識分布式系統時的筆記。 分布式系統的特點 多進程不共享操作系統不共享時鐘 分布式系統 由多個可獨立運行的子系統組成。每個子系統可以獨立選擇運行平臺。不同的運行平臺存在差異&#xff0c;比如操作系統&#xff0c;硬件規格等。由…

UE5 PCG學習筆記

https://www.bilibili.com/video/BV1onUdY2Ei3/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 一、安裝PCG 插件里選擇以下進行安裝 移動目錄后&#xff0c;可以使用 Update Redirector References&#xff0c;更新下&#xff0…

工業現場ModbusTCP轉EtherNETIP網關引領生物現場領新浪潮

生物質發生器是一種能夠產生、培養生物的設備。客戶現場需要將生物發生器連接到羅克韋爾系統&#xff0c;但是二者協議無法直接通訊&#xff0c;需要通過ModbusTCP轉Ethernet/IP網關將兩者進行通訊連接&#xff0c;生物質發生器以其獨特的工作原理和優勢&#xff0c;使得生物的…

寶藍德中間件部署war包時,配置的絕對路徑讀取錯誤。

文章目錄 問題場景解決辦法寶藍德是什么&#xff1f;&#xff1f;一、基礎環境與依賴配置二、自動化部署工具鏈三、高可用性與集群配置四、安全與合規性措施五、產品線差異化部署六、典型部署流程示例七、運維與優化 原因1. 明確“當前工作目錄”與“絕對路徑”的關系2. 問題根…

Java、Python、NodeJS等開發環境安裝及配置鏡像加速到國內源

文章目錄 Java1.Windows1.1 scoop方式安裝JDK 2.Linux2.1 apt方式安裝JDK2.1.1 切換JDK2.1.2 驗證版本2.1.3 原理 Python1.Windows1.1 scoop方式安裝Python1.2 uv方式安裝Python&#xff08;推薦&#xff09; 2.Linux2.1 apt方式安裝Python2.1.1 配置版本切換2.1.2 切換Python2…

Linux系統管理與編程16:PXE自動化安裝部署centos7.9操作系統

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 0.準備 1&#xff09;防火墻和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

MCP(Model Context Protocol)是專為LLM(大語言模型)應用設計的標準化協議

核心定義 MCP&#xff08;Model Context Protocol&#xff09;是專為LLM&#xff08;大語言模型&#xff09;應用設計的標準化協議&#xff0c;通過安全可控的方式向AI應用暴露數據和功能。主要提供以下能力&#xff1a; 標準化的上下文管理安全的功能調用接口跨平臺的數據交…

Fiori學習專題三十四:Responsiveness

在這一步中&#xff0c;我們提高了應用程序的響應能力。SAPUI5應用程序可以在手機、平板電腦和臺式機設備上運行&#xff0c;我們可以配置應用程序以充分利用每種場景的屏幕狀態。幸運的是&#xff0c;像sap.m.Table這樣的SAPUI5控件已經提供了許多我們可以使用的功能。 1.修改…

解決 TimeoutError: [WinError 10060] 在 FramePack項目中連接 Hugging Face 超時的問題

#工作記錄 以下是針對 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;適用于 FramePack項目中。 &#xff08;一般該錯誤的發生原因請重點排查Hugging Face模型倉庫受限需要登錄的情形&#xff09; FramePack項目參考資料 FramePack部署&#xff08;從PyCharm解…

obj = null; 賦值null之前沒有其他引用指向obj對象,那么,當obj=null時,會被垃圾回收機制立即回收嗎?

不會立即回收。 具體原因是&#xff1a; 賦值 obj null; 后&#xff0c;對象變成“不可達”&#xff0c;符合垃圾回收條件&#xff0c;但垃圾回收器并不會立刻回收它。垃圾回收是CLR自動控制的非確定性過程&#xff0c;什么時候執行回收取決于系統內存壓力、GC策略、分代情況…

【Ubuntu 安裝Docker CE-Jenkins】

安裝Docker CE(Ubuntu) Install | Docker Docs官網 使用apt倉庫安裝 DNS配置(可選) #手動替換 sudo vim /etc/systemd/resolved.conf #典型配置如下 [Resolve] DNS8.8.8.8 DNS114.114.114.114 FallbackDNS1.1.1.1 # 備用 DNS#sed替換 sudo sed -i /^#DNS/ {s/#DNS/DNS8.8.8…

5、開放式PLC梯形圖編程組件 - /自動化與控制組件/open-plc-programming

76個工業組件庫示例匯總 開放式PLC編程環境 這是一個開放式PLC編程環境的自定義組件&#xff0c;提供了一個面向智能倉儲堆垛機控制的開放式PLC編程環境。該組件采用蘋果科技風格設計&#xff0c;支持多廠商PLC硬件&#xff0c;具有直觀的界面和豐富的功能。 功能特點 多語…

內網和外網怎么互通?外網訪問內網的幾種簡單方式

在企業或家庭網絡中&#xff0c;經常會遇到不同內網環境下網絡互通問題。例如&#xff0c;當公司本地局域網內有個辦公OA網站&#xff0c;在辦公室內電腦上網可以登錄使用&#xff0c;但在家帶寬下就無法直接通信訪問到。這就需要我們采取一些實用的內外網互通技巧來解決這個問…

使用大語言模型進行機器人規劃(Robot planning with LLMs)

李升偉 編譯 長期規劃在機器人學領域可以從經典控制方法與大型語言模型在現實世界知識能力的結合中獲益。 在20世紀80年代&#xff0c;機器人學和人工智能&#xff08;AI&#xff09;領域的專家提出了莫雷奇悖論&#xff0c;觀察到人類看似簡單的涉及移動和感知的任務&#x…

【計算機視覺】OpenCV實戰項目: opencv-text-deskew:實時文本圖像校正

opencv-text-deskew&#xff1a;基于OpenCV的實時文本圖像校正 一、項目概述與技術背景1.1 核心功能與創新點1.2 技術指標對比1.3 技術演進路線 二、環境配置與算法原理2.1 硬件要求2.2 軟件部署2.3 核心算法流程 三、核心算法解析3.1 文本區域定位3.2 角度檢測優化3.3 仿射變換…

可視化圖解算法33:判斷是不是平衡二叉樹

1. 題目 描述 輸入一棵節點數為 n 的二叉樹&#xff0c;判斷該二叉樹是否是平衡二叉樹。 在這里&#xff0c;我們只需要考慮其平衡性&#xff0c;不需要考慮其是不是排序二叉樹 平衡二叉樹&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性質&#xff1…

【Linux網絡】應用層自定義協議與序列化

應用層自定義協議與序列化 應用層 我們程序員寫的一個個解決我們實際問題,滿足我們日常需求的網絡程序,都是在應用層. 協議是一種"約定".Socket的接口,在讀寫數據時,都是按"字符串"的方式來發送接收的.如果我們要傳輸一些"結構化的數據"怎么辦…

MySQL + Elasticsearch:為什么要使用ES,使用場景與架構設計詳解

MySQL Elasticsearch&#xff1a;為什么要使用ES&#xff0c;使用場景與架構設計詳解 前言一、MySQL Elasticsearch的背景與需求1.1 為什么要使用Elasticsearch&#xff08;ES&#xff09;&#xff1f;1.2 為什么MySQL在某些場景下不足以滿足需求&#xff1f;1.3 MySQL Elas…

PPL困惑度的計算

1. 公式 PPL&#xff08;Perplexity&#xff09;困惑度 是自然語言處理&#xff08;NLP&#xff09;中常用的評估語言模型&#xff08;Language Model&#xff09;性能的指標。PPL 用于衡量語言模型對語言序列的預測能力&#xff0c;數值越小&#xff0c;說明模型的預測能力越…