Python id()

Python id() 函數返回物件的“身份”。 物件的身份是一個整數,保證在其生命周期內是唯一且恆定的。 具有不重疊生命周期的兩個物件可能具有相同的 id() 值。 在 CPython 實現中,這是物件在內存中的地址。

Python id()

Python 緩存常用數據類型的 id() 值,如字符串整數元組等。 因此,如果它們的值相同,您可能會發現多個變量引用相同的物件並具有相同的 id() 值。 讓我們通過一個示例來檢查這一點。

# 整數
a = 10
b = 10
c = 11
d = 12

print(id(a))
print(id(b))
print(id(c))
print(id(d))

輸出:

4317900064
4317900064
4317900096
4317900128

注意,‘a’ 和 ‘b’ 的 id() 值相同,它們具有相同的整數值。 現在讓我們看看對於字符串和元組是否也會得到類似的行為?

# tuples
t = ('A', 'B')
print(id(t))

t1 = ('A', 'B')
print(id(t1))

# strings
s1 = 'ABC'
s2 = 'ABC'
print(id(s1))
print(id(s2))

輸出:

4320130056
4320130056
4320080816
4320080816

從輸出中可以看出,Python 緩存字符串和元組對象並使用它們來節省內存空間。

緩存僅適用於不可變對象,請注意,整數、字符串、元組都是不可變的。 因此,Python 實現可以使用緩存來節省內存空間並提高性能。

我們知道字典是可變的,現在來看看即使元素相同,不同字典的id()是否不同?

# dict
d1 = {"A": 1, "B": 2}
d2 = {"A": 1, "B": 2}
print(id(d1))
print(id(d2))

輸出:

4519884624
4519884768

如我們所料,字典對象返回不同的id()值,這裡似乎沒有緩存。

Python自定義對象的id()

讓我們看一個獲取自定義對象的id()值的簡單示例。

class Emp:
    a = 0


e1 = Emp()
e2 = Emp()

print(id(e1))
print(id(e2))

輸出:

4520251744
4520251856

總結

Python的id()值對於一個對象來說是唯一且恆定的。我們可以使用這個來確保兩個對象是否引用的是內存中的同一個對象。

您可以從我們的GitHub存儲庫中查看完整的Python腳本和更多Python示例。

參考:官方文檔

Source:
https://www.digitalocean.com/community/tutorials/python-id