1. 程式人生 > >Python中的id函式到底是什麼?

Python中的id函式到底是什麼?

Python官方文件給出的解釋是

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.

CPython implementation detail: This is the address of the object in memory.

由此可以看出:

1、id(object)返回的是物件的“身份證號”,唯一且不變,但在不重合的生命週期裡,可能會出現相同的id值。此處所說的物件應該特指複合型別的物件(如類、list等),對於字串、整數等型別,變數的id是隨值的改變而改變的。

2、一個物件的id值在CPython直譯器裡就代表它在記憶體中的地址。(CPython直譯器:http://zh.wikipedia.org/wiki/CPython)

  1. class Obj():  
  2.     def __init__(self,arg):  
  3.         self.x=arg  
  4. if __name__ == '__main__':  
  5.     obj=Obj(1)  
  6.     print id(obj)       #32754432
  7.     obj.x=2
  8.     print id(obj)       #32754432
  9.     s="abc"
  10.     print id(s)         #140190448953184
  11.     s="bcd"
  12.     print id(s)         #32809848
  13.     x=1
  14.     print id(x)         #15760488
  15.     x=2
  16.     print id(x)         #15760464

令外,用is判斷兩個物件是否相等時,依據就是這個id值

  1. class Obj():  
  2.     def __init__(self,arg):  
  3.         self.x=arg  
  4.     def __eq__(self,other):  
  5.         returnself.x==other.x  
  6. if __name__ == '__main__':  
  7.     obj1=Obj(1)  
  8.     obj2=Obj(1)  
  9.     print obj1 is obj2  #False
  10.     print obj1 == obj2  #True
  11.     lst1=[1]  
  12.     lst2=[1]  
  13.     print lst1 is lst2  #False
  14.     print lst1 == lst2  #True
  15.     s1='abc'
  16.     s2='abc'
  17.     print s1 is s2      #True
  18.     print s1 == s2      #True
  19.     a=2
  20.     b=1+1
  21.     print a is b        #True
  22.     a = 19998989890
  23.     b = 19998989889 +1
  24.     print a is b        #False

is與==的區別就是,is是記憶體中的比較,而==是值的比較