試圖瞭解以下內容具有相同列表的兩個變量具有不同的ID .....那是爲什麼?
爲什麼由Python分配的ID對於相同的列表不同?
x = [1, 2, 3]
y = [1, 2, 3]
id(x) != id(y)
True
id(x)
11428848
id(y)
12943768
試圖瞭解以下內容具有相同列表的兩個變量具有不同的ID .....那是爲什麼?
爲什麼由Python分配的ID對於相同的列表不同?
x = [1, 2, 3]
y = [1, 2, 3]
id(x) != id(y)
True
id(x)
11428848
id(y)
12943768
Python中的每個不同的對象對象都有自己的ID。它與內容無關 - 它與存儲描述對象的信息的位置有關。存儲在不同位置的任何不同對象都將具有不同的ID。 (這是sometimes,但不是always,對象的內存地址。)
這對了解可變對象(即可以更改的對象,如列表)尤爲重要。如果可以更改對象,則可以創建兩個具有相同內容的不同對象。他們將有不同的ID,如果您稍後更改,則第二個不會更改。
對於像整數和字符串這樣的不可變對象,這不重要,因爲內容永遠不會改變。即使兩個不可變對象具有不同的ID,如果它們具有相同的內容,它們本質上也是相同的。
這組想法非常深入。您可以將變量名稱視爲分配給ID號碼的標籤,該ID號碼又可以唯一標識一個對象。可以使用多個變量名來標記同一個對象。觀察:
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
4532949432
>>> id(b)
4533024888
那,你已經發現了。現在讓我們創建一個新的變量名稱:
>>> c = b
>>> id(c)
4533024888
沒有創建新對象。標記爲b
的對象現在也標記爲c
。當我們改變a
會發生什麼?
>>> a[1] = 1000
>>> a
[1, 1000, 3]
>>> b
[1, 2, 3]
a
和b
是不同的,因爲我們知道,因爲他們有不同的ID。所以改變一個不會影響另一個。但是b
和c
是同一個對象 - 請記住?所以...現在
>>> b[1] = 2000
>>> b
[1, 2000, 3]
>>> c
[1, 2000, 3]
,如果我給你一個新值b
,它並不會改變對對象本身任何東西 - 只是他們標記的方式:
>>> b = a
>>> a
[1, 1000, 3]
>>> b
[1, 1000, 3]
>>> c
[1, 2000, 3]
謝謝Senderle,真正的教科書反應,非常好的解釋。 – 2014-12-13 16:06:32
Python保留具有不同ID的可變變量,這就是爲什麼。
您也可以使用不可變對象id
來檢查它;例如,一個元組。
謝謝qqvc - 我現在看到它,只是將x索引0更改爲4並進行了ID檢查,並返回了相同的ID。感謝您的快速響應 – 2014-12-13 15:13:10
'(1,2,3)是(1,2,3)'在解釋器中也會是'False';它不是*只是*關於可變與不可變。 – jonrsharpe 2014-12-13 15:23:00
那些列表不一樣。它們可能包含相同的信息,但它們並不相同。如果你讓y = x,你會發現實際上id是一樣的。
的,爲什麼到的是,如果你這樣做:
l = [1, 2, 3]
m = [1, 2, 3]
l.append(4)
IDS不應該是相同的,因爲它們識別它們id必須不對任何改變對象。 所有可變對象都以這種方式工作。但是元組(它是不可變的)也是這種情況。
編輯: 如下所述,ids可能指的是某些python實現中的內存地址,但不是全部。
這會讓水有點混濁,但是你的第一個陳述並不一定適用於python的所有實現。這在[cpython]中是正確的(https://docs.python.org/2/library/functions.html#id);但我相信(例如)IronPython的工作方式不同。強調不變量(來自上面的鏈接)可能會更好:「這是一個整數(或長整數),它在其生命週期內保證對這個對象是唯一且恆定的。」 – senderle 2014-12-13 15:20:18
經編輯後,可在答案結尾處提供更多信息。 – 2014-12-13 15:25:46
因爲它們是不同的列表。您創建兩次相同的列表。 – 2014-12-13 15:08:12