Python id()是Python的一個內置函數,其作用是返回一個對象的身份標識。Python中一個對象的標識是一個整數。該整數保證對象在其生命周期中是唯一和固定的。在非覆蓋的生命周期中,兩個對象可能有相同的id()值,在CPython的底層實現中,id()函數用作獲取對象的內存地址。
val = id(object)
object:用于獲取標識的對象。
該函數的返回值是一個整數,是對象的標識。
Python中對象的id對于緩存變量的值是非常有用的,Python使用id()函數檢索變量值的機制使Python具有更好的性能,也會出現對于多個變量具有相同值的話,其id()值也會相同的。
a = 123
b = 123
c = b
print(f"id(a)={id(a)}")
print(f"id(b)={id(b)}")
print(f"id(c)={id(c)}")
d1 = 124
d2 = 124.0
e1 = 112.1
e2 = 112.1
print(f"id(d1)={id(d1)}")
print(f"id(d2)={id(d2)}")
print(f"id(e1)={id(e1)}")
print(f"id(e2)={id(e2)}")
f = 1+2j
g = 1+2j
print(f"id(f)={id(f)}")
print(f"id(g)={id(g)}")
h = 10
i = 0b1010
j = 0xA
print(f"id(h)={id(h)}")
print(f"id(i)={id(i)}")
print(f"id(j)={id(j)}")
輸出結果如下:
id(a)=8791228343776
id(b)=8791228343776
id(c)=8791228343776
id(d1)=8791228343808
id(d2)=46971184
id(e1)=44969648
id(e2)=44969648
id(f)=47414032
id(g)=47414032
id(h)=8791228340160
id(i)=8791228340160
id(j)=8791228340160
從上面的輸出的結果中可以具有相同值和類型的變量具有相同的id()值,即使不同的進制形式,如值相同其id()值也是相同的。這種機制使值相同的變量指向相同的內存以節省內存。
同時,也可以看到變量a,b,c和變量d1之間相差32,這正好是4個字節的32位。
下面再看看這種情況是否在字符串和元組中是否也存在。
str1 = "abc"
str2 = "abc"
str3 = "AbC"
print(f"id(str1)={id(str1)}")
print(f"id(str2)={id(str2)}")
print(f"id(str3)={id(str3)}")
t1 = (11,12,13)
t2 = (11,12,13)
t3 = (11,12,13.0)
print(f"id(t1)={id(t1)}")
print(f"id(t2)={id(t2)}")
print(f"id(t3)={id(t3)}")
輸出結果:
id(str1)=31050992
id(str2)=31050992
id(str3)=47970032
id(t1)=47936000
id(t2)=47936000
id(t3)=47968768
從輸出結果可以看出,具有相同值的字符串和元組也具有相同的id()值,不同的字符串或元組其id()值不同。
對字典或列表是否也是這樣呢?
d1 = {"k1":1,"k2":2}
d2 = {"k1":1,"k2":2}
d3 = d2
print(f"id(d1)={id(d1)}")
print(f"id(d2)={id(d2)}")
print(f"id(d3)={id(d3)}")
lst1 = [11,12,13]
lst2 = [11,12,13]
lst3 = lst2
print(f"id(lst1)={id(lst1)}")
print(f"id(lst2)={id(lst2)}")
print(f"id(lst3)={id(lst3)}")
輸出結果如下:
id(d1)=47521472
id(d2)=47969088
id(d3)=47969088
id(lst1)=47908352
id(lst2)=47910080
id(lst3)=47910080
從輸出結果可以看出,值相同的字典或列表,其id()值不相同,只有通過兩個變量直接賦值的形式,其才會共享內存,具有相同的id()值。
總結以上各個案例可以看出,對于不可變對象(數字、字符串、元組)其值若相同,則變量的id()值是相同的,而對于可變對象(字典、列表)其值相同,但id()值不會相同,只有通過變量間直接賦值時,其id()值才會相同。
4、參數是自定義對象
#自定義對象
class Test:
def __init__(self):
self.data = 0
tmp1 = Test()
tmp2 = Test()
print(f"id(tmp1)={id(tmp1)}/nid(tmp2)={id(tmp2)}")
輸出結果:
id(tmp1)=47312080
id(tmp2)=48514816
以上是關于Python中內置函數id()的使用方法及案例,如有疑問請留言。
新聞熱點
疑難解答