python 提供很多的比較的方便,其中大家可能較常用 == 和 is,這個post 就講講他們的分別
is 是比較 variable 的pointer address
== 是比較 variable 的 value
簡單例子:
>>> p1 = { "name": "tom", "age": 11}
>>> p2 = { "name": "tom", "age": 11}
>>> p1 == p2
True
>>> p1 is p2
False
>>> hex(id(p1))
'0x104fdc800'
>>> hex(id(p2))
'0x104fdc840'
以上的例子都很簡單,因為 p1 同 p2 實際在memory 裡是兩個不同的 object ,不過他們有著一樣的 value,所以用 == 去比較時,會得到 True,而用 is 去比較時,會得到 False 。
我們再考慮以下的例子
>>> a = 256
>>> b = 256
>>> c = 257
>>> d = 257
>>> a == b
True
>>> c == d
True
>>> a is b
True
>>> c is d
False
為什麽 a 和 b 可以用 == 和 is 去比較,但 c 和 d 就不可以?
原來當 python 一開始是會把一常用的數值 load 入 memory ,這些數值包括 True, False, -256 to +256 ,所以他們有一樣的 memory address ,而大過256 的值,python 就會即時 allocate 新的 address
>>> hex(id(a))
'0x105b100d8'
>>> hex(id(b))
'0x105b100d8'
>>> hex(id(c))
'0x104fdffb0'
>>> hex(id(d))
'0x105047030'
所以 a b 是有一樣的 address ,而 c d 的 address 是不同
True False 在 python 世界裡都是一個 obj,他們都有各自的address,所以python 的 True 和 False 是大楷 T 和 F
>>> hex(id(True))
'0x105ad8b48'
>>> hex(id(False))
'0x105ad8b68'