python 中 is和==的區別
阿新 • • 發佈:2021-07-11
一.is和==區別
- id() 我們可以使用id()查到一個變量表示的值在記憶體中的地址
print(id(s)) # 3212877232496 s = 'haha' print(id(s)) # 3212877232496 lst = [1, 2, 4] print(id(lst)) # 4326685768 lst1 = [1, 2, 4] print(id(lst1)) # 4326684360 # 我們發現. 字串的資料地址是⼀樣的. ⽽ 列表的資料地址是不⼀樣的.
- ⼩資料池(常量池): 把我們使⽤過的值儲存在⼩資料池中.供其他的變數使⽤. ⼩資料池給數字和字串使⽤, 其他資料型別不存在. 對於數字: -5~256是會被加到⼩資料池中的. 每次使⽤都是同⼀個物件
- 對於字串:
- 如果是純⽂字資訊和下劃線. 那麼這個物件會被新增到⼩資料池
- 如果是帶有特殊字元的. 那麼不會被新增到⼩資料池. 每次都是新的
- 如果是單⼀字⺟*n的情況. 'a'*20, 在20個單位內是可以的. 超過20個單位就不會新增 到⼩資料池中
- 注意(⼀般情況下): 在py⽂件中. 如果你只是單純的定義⼀個字串. 那麼⼀般情況下都是會 被新增到⼩資料池中的. 我們可以這樣認為: 在使⽤字串的時候, python會幫我們把字串 進⾏快取, 在下次使⽤的時候直接指向這個字串即可. 可以節省很多記憶體.
- is比較的就是id()計算出來的結果. 由於id是幫我 們檢視某資料(物件) 的記憶體地址. 那麼is比較的就是資料(物件)的記憶體地址. 最終我們通過is可以檢視兩個變數使⽤的是否是同⼀個物件.
-
== 雙等表⽰的是判斷是否相等, 注意. 這個雙等比較的是具體的值.⽽不是記憶體地址
s1 = "哈哈" s2 = "哈哈" print(s1 == s2) # True print(s1 is s2) # True 原因是有⼩資料池的存在 導致兩個變數指向的是同⼀個物件 l1 = [1, 2, 3] l2 = [1, 2, 3] print(l1 == l2) # True, 值是⼀樣的 print(l1 is l2) # False, 值是假的