身份運算
每個資料都存在一個特定的記憶體位置裡,身分運算 is
就是告訴我們兩個資料是否來自同一個記憶體位置,簡單一點講,這兩個資料是不是同一個!
但常常被大家誤解的是,is
跟 ==
的不同,這邊我們要鄭重澄清,==
只能判定兩個資料的值相等,而不能判定他們的身分相同,我們看例子:
>>> a = 1
>>> b = 1
>>> lst_1 = [1,2,3]
>>> lst_2 = [1,2,3]
>>> a == b
True
>>> a is b
True
>>> lst_1 == lst_2
True
>>> lst_1 is lst_2
False
在這個例子中,我們很明顯地發現到 a
跟 b
的值相同,且他們所參照的整數 1
是來自同一個位置,這點我們不必太過訝異,Python 總是很聰明地只產生並儲存這些不可變的資料一次,當有多個變數都被賦予該值的時候,讓這些變數都參照到同一個資料。為什麼我們說這樣很聰明呢?你想想看,如果每有一個變數的值要設成 1
,我們就要產生一個新的1,不是很浪費空間嗎?
但是我們看到 lst_1
和 lst_2
的例子就不是這樣了,他們的值的確是相同的,但是他們是完全不同的兩份資料!對於可變的資料型態,普通的賦值運算總會產生一個新的資料,當然我們做身分確認時,Python 會告訴我們他們不是同一個人。