變量不是盒子
在示例所示的交互式控制臺中,無法使用“變量是盒子”做解釋。圖說明了在 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 lewisTruealex 指代的對象與賦值給 lewis 的對象內容一樣,比較兩個對象,結果相等,這是因為 dict 類的 __eq__ 方法就是這樣實現的,但它們是不同的對象。這是 Python 說明標識不同的方式:a is notb。
示例體現了別名。在那段代碼中,lewis 和 charles 是別名,即兩個變量綁定同一個對象。而 alex 不是 charles 的別名,因為二者綁定的是不同的對象。alex 和 charles 綁定的對象具有相同的值(== 比較的就是值),但是它們的標識不同。
在==和is之間選擇
== 運算符比較兩個對象的值(對象中保存的數據),而 is 比較對象的標識。通常,我們關注的是值,而不是標識,因此 Python 代碼中 == 出現的頻率比 is 高。然而,在變量和單例值之間比較時,應該使用 is。目前,最常使用 is檢查變量綁定的值是不是 None。下面是推薦的寫法:
新聞熱點
疑難解答