1. 程式人生 > 其它 >python 中 is和==的區別

python 中 is和==的區別

一.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會幫我們把字串 進⾏快取, 在下次使⽤的時候直接指向這個字串即可. 可以節省很多記憶體.
  1. is比較的就是id()計算出來的結果. 由於id是幫我 們檢視某資料(物件) 的記憶體地址. 那麼is比較的就是資料(物件)的記憶體地址. 最終我們通過is可以檢視兩個變數使⽤的是否是同⼀個物件.
  2. == 雙等表⽰的是判斷是否相等, 注意. 這個雙等比較的是具體的值.⽽不是記憶體地址

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, 值是假的

  總結:

is 比較的是地址

== 比較的是值