變數(variables)的身份(identity) | Python

Python 中, 變數的身份(identity) 是指變數所指向的記憶體地址。每個在 Python 中創建的對象都有一個唯一的身份標識,這個標識是根據對象在記憶體中的位置而定的。變數的身份實際上就是這個記憶體地址。

你可以使用id()函數來獲取一個對象的身份。這個函數返回一個唯一的識別碼,表示對象在記憶體中的位置。

範例:

在下面的例子中,id(a)和id(b)將會返回相同的數值,表示變數a和b指向相同的記憶體地址,即它們具有相同的身份。

a = [1, 2, 3]
print(id(a))  # 印出a的身份

b = a
print(id(b))  # 印出b的身份,與a相同

在下面的例子中,id(a)和id(b)將會返回不同的記憶體地址,雖然他們的值是相同的,但是他們的id()卻是不一樣的

a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))  # 印出a的身份

print(id(b))  # 印出b的身份,雖然值和a相同但是id()卻是不同的

深入理解變數(variables)的身份(identity)的優勢

在Python中,我們可以透過身份(identity)來查看記憶體的位置,所以我們可以查看 原始型別(Primitive Types)和引用型別(Reference Types) 的記憶體位置,可以讓我們更深入去理解Python語言的特性。

以下我們將用範例來解釋之間的差異:

原始型別(Primitive Types)的身份(identity)

  • 我們可以發現,在原始型別中,如果變數的值相同的話,記憶體的位置會相同
  • 原始型別中變數的值不同,記憶體位置才會不同
name1 = 'Tom'
name2 = 'Tom'

print(name1 == name2) # True
print(name1 is name2) # True

# 我們查看2個原始型別的id()
print(id(name1)) # 140160478972208
print(id(name2)) # 140160478972208

引用型別(Reference Types)的身份(identity)

  • 我們可以發現,在引用型別中,即使變數的值相同,記憶體的位置也會不相同
  • 引用型別中的變數不管值有沒有相同,記憶體位置都會不一樣
person1 = { 'name': 'Tom', 'age': 18 }
person2 = { 'name': 'Tom', 'age': 18 }

print(person1 == person2) # True
print(person1 is person2) # False

# 我們查看2個引用型別的id()
print(id(person1)) # 140162227009088
print(id(person2)) # 140162227060032

結論:

當我們在實際的開發場景中,往往因為不熟悉Python的 變數(variables)的身份(identity)原始型別(Primitive Types)和引用型別(Reference Types) 的差別,在 if else statement 的判斷中,寫出非常隱蔽的bug,因此深入的去理解Python變數的基礎特性,對於往後開發有非常大的幫助。