Python中的標識、相等性與別名:深入理解對象引用機制

在Python編程中,理解變量如何引用對象以及對象之間的比較方式是至關重要的基礎概念。本文將通過Lewis Carroll的筆名示例,深入探討Python中的對象標識、相等性判斷以及別名機制。

別名現象:變量共享同一對象

>>> charles = {'name': 'Charles L. Dodgson', 'born': 1832}
>>> lewis = charles  # 創建別名 
>>> lewis is charles  # 驗證是同一對象 
True 
>>> id(charles), id(lewis)  # 內存地址相同
(4300473992, 4300473992)
>>> lewis['balance'] = 950  # 通過別名修改對象
>>> charles  # 原始變量也看到變化
{'name': 'Charles L. Dodgson', 'balance': 950, 'born': 1832}

在這個例子中,lewis和charles是同一字典對象的兩個不同名稱(別名)。它們不僅值相同,而且指向內存中的同一位置,因此:

  • is運算符返回True
  • id()函數返回相同的地址
  • 通過任一變量修改對象都會反映到另一變量上

值相等與標識不同的情況

>>> alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}
>>> alex == charles  # 值比較 
True 
>>> alex is not charles  # 標識比較
True 

alex字典雖然內容與charles相同,但它們是獨立的對象:

  • ==比較值(調用__eq__方法),返回True
  • is比較內存地址,返回False

對象三要素與比較機制

每個Python對象都有三個基本特征:

  • 標識(identity):對象在內存中的唯一地址,可用id()獲取且永不改變
  • 類型(type):決定對象支持的操作,用type()獲取
  • (value):對象包含的實際數據

比較操作的選擇指南:

  • is比較標識(內存地址),速度更快且不可重載
  • ==比較值,可被__eq__方法重載,通常更關注業務邏輯
    特別提示:與None比較時,必須使用is或is not,這是Python社區的明確約定。

元組的"相對不可變性"

元組的不可變性僅保證其直接包含的引用不變,但若引用可變對象(如列表),這些對象的內容仍可修改:

>>> t1 = (1, 2, [30, 40])
>>> t2 = (1, 2, [30, 40])
>>> t1 == t2  # 初始相等 
True 
>>> t1[-1].append(99)  # 修改元組中的列表
>>> t1
(1, 2, [30, 40, 99])
>>> t1 == t2  # 不再相等
False

這種現象解釋了:

  • 元組中列表的標識始終未變(id(t1[-1])不變)
  • 值比較結果因可變元素內容改變而變化
  • 這也是包含可變元素的元組不可散列的原因

實際應用建議

何時使用is:

  • 與None、True、False等單例值比較時
  • 需要嚴格判斷是否為同一對象時

何時使用==:

  • 絕大多數業務場景下的值比較
  • 需要自定義比較邏輯時(通過重載__eq__)

性能考慮:

  • is比==更快(不涉及方法調用)
  • 對大型嵌套結構,值比較可能很昂貴

理解這些概念對于避免Python中的微妙bug至關重要,特別是在處理可變默認參數、淺拷貝/深拷貝等場景時。記住:Python中的變量是附加在對象上的標簽(引用),而非存儲數據的容器本身。

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

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

相關文章

python 閉包獲取循環數據經典 bug

問題代碼 def create_functions():functions []for i in range(3):# 創建一個函數,期望捕獲當前循環的i值functions.append(lambda: print(f"My value is: {i}"))return functions# 創建三個函數 f0, f1, f2 create_functions()# 調用這些函數 f0() # 期望輸出 &…

克里金模型+多目標優化+多屬性決策!Kriging+NSGAII+熵權TOPSIS!

目錄 效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 克里金模型多目標優化多屬性決策!KrigingNSGAII熵權TOPSIS!!matlab2023b語言運行! 1.克里金模型(Kriging Model)是一種基于空間統計學的插值方法…

Prompt Engineering 提示詞工程學習

一、Prompt Engineering 簡介 Prompt Engineering 是設計和優化輸入提示(Prompt)以獲得預期輸出的過程。在與大型語言模型(如 GPT-4)交互時,如何構造提示會顯著影響模型的回答質量。 二、Prompt 的重要性 提高生成準確性:通過正確的 Prompt 引導,模型能夠更好地理解用…

MATLAB安裝常見問題及解決方案詳解(含代碼示例)

MATLAB作為科學計算和工程分析的核心工具,其安裝過程可能因操作系統版本、硬件配置或網絡環境等因素而出現各種問題。本文基于MATLAB官方文檔和社區經驗,系統總結了安裝過程中常見的問題,并提供詳細的解決方案和代碼示例,幫助用戶…

免安裝 + 快速響應Photoshop CS6 精簡版低配置電腦修圖

各位PS小白和修圖大神們,今天來給大家聊聊Photoshop CS6精簡版這個寶藏軟件! Photoshop CS6精簡版就是Adobe Photoshop CS6的“瘦身版”,它把一些不常用的功能給簡化了,只留下核心工具,特別適合那些想高效操作、節省系…

微服務架構實戰:從服務拆分到RestTemplate遠程調用

微服務架構實戰:從服務拆分到RestTemplate遠程調用 一 . 服務拆分1.1 服務拆分注意事項1.2 導入服務拆分 Demo1.3 小結 二 . 服務間調用2.1 注冊 RestTemplate2.2 實現遠程調用2.3 小結 三 . 提供方和消費方 在分布式系統設計中,微服務架構因其靈活性、可…

MySQL 索引與事務詳解

目錄 一、索引(Index) 二、事務(Transaction) 三、總結 一、索引(Index) 索引的本質:一種數據結構(如 BTree、Hash),用于快速定位數據,避免全…

macOS Python 環境配置指南

1. 檢查現有 Python 環境 python3 --version # 檢查 Python 3 版本 pip3 --version # 檢查 pip 版本 2. 安裝 pyenv(Python 版本管理工具) # 使用 Homebrew 安裝 pyenvbrew install pyenv# 配置 pyenv 環境變量(添加到 ~/.zshrc&#…

游戲引擎學習第272天:顯式移動轉換

回顧并為今天的內容鋪墊背景 我們剛開始為游戲主角編寫一些程序邏輯,因為我們之前已經完成了大部分引擎方面的開發,現在可以專注在角色身上。這個角色的移動方式會有些特別,與大多數游戲角色的運動機制不太一樣。我們當前正在實現的控制方式…

軟件測試都有什么???

文章目錄 一、白盒測試(結構測試)二、黑盒測試(功能測試)三、灰盒測試四、其他測試類型五、覆蓋準則對比六、應用場景 軟件測試主要根據測試目標、技術手段和覆蓋準則進行分類。分為白盒測試、黑盒測試、灰盒測試及其他補充類型 一…

very_easy_sql(SSRF+SQL注入)

題目有一行提示: you are not an inner user, so we can not let you have identify~(你不是內部用戶,所以我們不能讓你進行身份驗證)聯想到可能存在SSRF漏洞,一般情況下,SSRF攻擊的目標是外網無法訪問的內…

國內外主流AI編程工具全方位對比分析(截至2025年5月)

一、國際主流工具對比 1. Windsurf(Codeium公司) 核心功能:代理型AI編程(代碼導航/修改/命令執行)、瀏覽器DOM訪問、網頁研究功能語言支持:70語言,包括Python/Java/JavaScript/Rust等[[22-23]…

ARP協議的工作原理

文章目錄 ARP協議的工作原理ARP報文(以太網)ARP高速緩存 ARP協議的工作原理 ARP協議的作用是實現任意網絡層地址到任意物理地址轉換。工作原理是: 主機向自己所在網絡廣播一個ARP請求,該請求包含目標機器的網絡地址。處于該網絡…

【小知識酷】《Matlab》考點精簡

在線編譯器 https://matlab.mathworks.com/?elqsidumic49viv8wu5r6fckew 第1章 matlab基礎知識 第1節 輸出函數 1. 使用disp函數 disp函數可用于輸出變量的值或者字符串。 % 輸出字符串 disp(Hello, MATLAB!); %顯示Hello, MATLAB!% 輸出變量 x 10; disp(x); %顯示10% 輸出數…

碼蹄集——中庸之道(三個數比較)

MT1112 中庸之道 請編寫一個簡單程序,輸入3個整數,比較他們的大小,輸出中間的那個數 格式 輸入格式: 輸入整型,空格分隔 輸出格式:輸出整型 樣例 1 輸入:1 5 3 輸出:3 比較…

快速搭建一個vue前端工程

一、環境準備 1、安裝node.js 下載地址:Node.js 推薦版本如下: 2、檢查node.js版本 node -v npm -v 二、安裝Vue腳手架 Vue腳手架是Vue官方提供的標準化開發工具。vue官網:https://cn.vuejs.org/ 全局安裝vue/cli (僅第一次…

React Native基礎環境配置

React Native基礎環境配置 1.引言2.React-Native簡介3.項目基礎環境搭建1.引言 感覺自己掌握的知識面還是有點太窄了,于是決定看看移動端的框架,搞個react搭一個后端管理項目,然后拿react-native寫個小的軟件,試著找個三方上架一下應用市場玩玩。畢竟不可能一直在簡歷上掛一…

PHP和Composer 安裝

Composer 是 PHP 的 依賴管理工具,就像: Node.js 用 npm Python 用 pip Java 用 maven 用來安裝和管理 PHP 項目中需要用到的第三方庫 安裝PHP可以理解成 Java解釋器 安裝PHP PHP For Windows: Binaries and sources Releaseshttps://windows.php.n…

API請求參數有哪些?

通用參數 app_key:應用的唯一標識,用于驗證應用身份,調用API時必須提供。 timestamp:請求時間戳,通常為當前時間的毫秒級時間戳,用于防止請求被重放攻擊。 format:返回數據的格式,…

并發筆記-條件變量(三)

文章目錄 背景與動機30.1 條件變量的定義與基本操作 (Definition and Routines)30.2 生產者/消費者問題 (Bounded Buffer Problem)30.3 覆蓋條件 (Covering Conditions) 與 pthread_cond_broadcast30.4 總結 背景與動機 到目前為止,我們已經學習了鎖 (Locks) 作為并…