1. 程式人生 > >Python 中的 id() 函式

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。


歡迎到微信裡去當吃瓜群眾