国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

基于Python對象引用、可變性和垃圾回收詳解

2020-02-16 02:07:07
字體:
來源:轉載
供稿:網友

變量不是盒子

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

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

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

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

注意:

對引用式變量來說,說把變量分配給對象更合理,反過來說就有問題。畢竟,對象在賦值之前就創建了

標識、相等性和別名

Lewis Carroll 是 Charles Lutwidge Dodgson 教授的筆名。Carroll 先生指的就是 Dodgson 教授,二者是同一個人。🌰 用 Python 表達了這個概念。

charles 和 lewis 指代同一個對象

>>> lewis = charles>>> lewis is charlesTrue>>> id(lewis), id(charles)(4303312648, 4303312648)>>> lewis['balance'] = 950>>> charles{'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}

然而,假如有冒充者(姑且叫他 Alexander Pedachenko 博士)生于 1832年,聲稱他是 Charles L. Dodgson。這個冒充者的證件可能一樣,但是Pedachenko 博士不是 Dodgson 教授。這種情況如圖

charles 和 lewis 綁定同一個對象,alex 綁定另一個具有相同內容的對象

alex 與 charles 比較的結果是相等,但 alex 不是charles

>>> lewis{'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}>>> alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}>>> lewis == alexTrue>>> alex is not lewisTrue

alex 指代的對象與賦值給 lewis 的對象內容一樣,比較兩個對象,結果相等,這是因為 dict 類的 __eq__ 方法就是這樣實現的,但它們是不同的對象。這是 Python 說明標識不同的方式:a is notb。

示例體現了別名。在那段代碼中,lewis 和 charles 是別名,即兩個變量綁定同一個對象。而 alex 不是 charles 的別名,因為二者綁定的是不同的對象。alex 和 charles 綁定的對象具有相同的值(== 比較的就是值),但是它們的標識不同。

在==和is之間選擇

== 運算符比較兩個對象的值(對象中保存的數據),而 is 比較對象的標識。通常,我們關注的是值,而不是標識,因此 Python 代碼中 == 出現的頻率比 is 高。然而,在變量和單例值之間比較時,應該使用 is。目前,最常使用 is檢查變量綁定的值是不是 None。下面是推薦的寫法:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西乡县| 晴隆县| 岐山县| 屏南县| 马尔康县| 门头沟区| 英超| 资源县| 德安县| 沙洋县| 石门县| 嘉荫县| 鹿泉市| 安丘市| 明水县| 南乐县| 宁明县| 呼和浩特市| 仲巴县| 滨州市| 龙里县| 北海市| 池州市| 任丘市| 阿拉尔市| 平陆县| 南召县| 广西| 临清市| 钟祥市| 临朐县| 德安县| 冕宁县| 防城港市| 开平市| 扬中市| 客服| 荔波县| 桃园县| 新密市| 玛纳斯县|