同一性與平等:解開比較難題
在程式設計領域,比較資料可能是一項基本任務。然而,當涉及字串時,程式設計師在使用“==”或“is”運算符進行比較時經常會遇到意想不到的結果。讓我們深入研究這個令人費解的現象,並探討為什麼 s1 == s2 和 s1 is s2 的輸出可能不同。
困境
考慮以下Python 代碼:
s1 = 'text' s2 = 'text'
直覺上,人們可能期望s1 == s2 和s1 是s2 返回True,因為這兩個變數都被指派了相同的字串值。然而,雖然 s1 == s2 始終返回 True,表示相等,但在某些情況下 s1 is s2 令人驚訝地返回 False。
揭開真相
要理解這種行為,區分身份測試(由「is」執行)和相等測試(由「==」執行)至關重要。身份測試確定兩個變數是否引用記憶體中完全相同的對象,而相等性測試則驗證它們的值是否相同。
在Python解釋器中,當我們將相同的字串值指派給多個變數時,如上面的範例中,Python 透過將字串值儲存在記憶體中的單一位置並將所有變量連結到該位置來優化空間。這意味著 s1 和 s2 引用同一個對象,因此值相等。
但是,Python 也實作了一種稱為 interning 的機制,其中某些公用字串值儲存在共用池中。當建立帶有內部值的新字串時,Python 在分配新的記憶體位置之前會檢查該值是否已存在於池中。如果是,則使用現有位置,使多個字串變數能夠有效地指向相同記憶體位置。
實習的作用
在' 的情況下text',它是一個內部字串值,這意味著s1 和s2 都引用記憶體中相同的內部值。因此,s1 == s2 傳回 True,確認它們的值相等。
但是,s1 是 s2 有時回傳 False 的原因在於 Python 處理賦值的方式。當我們將非駐留字串值指派給變數時,會為該字串指派一個新的記憶體位置。這意味著,儘管兩個變數具有相同的值,但它們不再引用記憶體中的相同物件。因此,s1 is s2 的計算結果為 False,表示它們不是同一個物件。
本質上
掌握身分測試和相等測試之間的差異對於理解為什麼使用「==」或「is」比較字串會產生不同的結果至關重要。 s1 == s2 比較字串值的相等性,而 s1 is s2 比較變數在記憶體中所引用的物件的識別。
以上是為什麼在Python中比較字串時`s1 == s2`和`s1 is s2`有時會回傳不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!