Python 中的 id() 函式
在 python 中,有個 id() 函式,是用來獲得一個 Object 的 id 的,在文件中介紹也非常簡單:
id(object)
Return the “ identity ” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
這是 python 為每個 Object 在執行時定製了一個唯一 id,但是需要注意的是,當兩個 Object 當生命域不重疊的時候,可能會有相同的 id。
Object's Identity
對於任何一個 Object 來說,都有一個 id,如果多個變數指向了同一個靜態常量,那麼這幾個變數講擁有同樣的 id。
>>> s1 = "abc" >>> s2 = "abc" >>> s1 == s2 True >>> id(s1) 4390873208 >>> id(s2) 4390873208 >>> s1 is s2 True
如果兩個不同的變數(常量),肯定將有不同的 id。
>>> id("abc")
4390873208
>>> id("abcd")
4391753216
is 比較
在 python 中,有兩種常用的比較方式,一個是 ==
比較,一個是 is
比較,前者是用來比較值是不是相等,後者是判斷是不是屬於同一個物件。其實,在 python 中,is 比較便是通過 id()
來實現的。當兩個 Objec 擁有相同的 id 時,便會認為這是兩個相同的物件。
因此,可以認為:object1 is object2
等價於 id(object1) == id(object2)
例外
今天在 v2ex 看到一個好玩的帖子(https://www.v2ex.com/t/336021 ),提到了 id([1]) == id([2])
會返回 True
。
而我跑了一組資料,結果也是很有意思:
>>> id([1])
4391579520
>>> id([2])
4391579520
>>> a = [1]
>>> b = [1]
>>> id([1])
4391757944
>>> id([2])
4391757944
>>> id(a)
4391579520
>>> id(b)
4391641672
>>> id([1])
4391787072
>>> id([2])
4391787072
因為在文件中已經提到了,兩個不同生命域的物件可能會有相同的 id,因此出現這種情況也不例外,畢竟 [1]
,[2]
,現在的確是兩個不同的生命域的常量,因為這兩個常量沒有被任何變數引用,當使用結束之後,便會被回收掉,因此會出現兩個不同的常量出現相同 id 的情況。
當給他們新增引用,會發現這個 id 就被確定到這個一個 [1]
常量上了,這是因為 這個 [1]
的生命域並沒有結束(還被引用不能被回收),因此,新的 list object 不會再使用這個 id 而是換了新的 id。
歡迎到微信裡去當吃瓜群眾