国产探花免费观看_亚洲丰满少妇自慰呻吟_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。下面是推薦的寫法:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 静乐县| 涪陵区| 来凤县| 鄂托克前旗| 枣阳市| 赤城县| 漾濞| 华坪县| 华蓥市| 台州市| 雅安市| 嘉义县| 金坛市| 牡丹江市| 祁阳县| 台北县| 石嘴山市| 壶关县| 阿巴嘎旗| 大宁县| 南安市| 凌海市| 白银市| 吉水县| 晴隆县| 徐汇区| 长乐市| 修水县| 牡丹江市| 枣强县| 高州市| 滨海县| 灵石县| 梅河口市| 铜鼓县| 西充县| 苏尼特右旗| 外汇| 岑巩县| 团风县| 永仁县|