2014-12-13 74 views

回答

3

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] 

ab是不同的,因爲我們知道,因爲他們有不同的ID。所以改變一個不會影響另一個。但是bc是同一個對象 - 請記住?所以...現在

>>> 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] 
+1

謝謝Senderle,真正的教科書反應,非常好的解釋。 – 2014-12-13 16:06:32

1

Python保留具有不同ID的可變變量,這就是爲什麼。

您也可以使用不可變對象id來檢查它;例如,一個元組。

+1

謝謝qqvc - 我現在看到它,只是將x索引0更改爲4並進行了ID檢查,並返回了相同的ID。感謝您的快速響應 – 2014-12-13 15:13:10

+1

'(1,2,3)是(1,2,3)'在解釋器中也會是'False';它不是*只是*關於可變與不可變。 – jonrsharpe 2014-12-13 15:23:00

2

那些列表不一樣。它們可能包含相同的信息,但它們並不相同。如果你讓y = x,你會發現實際上id是一樣的。

3

的,爲什麼到的是,如果你這樣做:

l = [1, 2, 3] 
m = [1, 2, 3] 
l.append(4) 

IDS不應該是相同的,因爲它們識別它們id必須不對任何改變對象。 所有可變對象都以這種方式工作。但是元組(它是不可變的)也是這種情況。

編輯: 如下所述,ids可能指的是某些python實現中的內存地址,但不是全部。

+1

這會讓水有點混濁,但是你的第一個陳述並不一定適用於python的所有實現。這在[cpython]中是正確的(https://docs.python.org/2/library/functions.html#id);但我相信(例如)IronPython的工作方式不同。強調不變量(來自上面的鏈接)可能會更好:「這是一個整數(或長整數),它在其生命週期內保證對這個對象是唯一且恆定的。」 – senderle 2014-12-13 15:20:18

+0

經編輯後,可在答案結尾處提供更多信息。 – 2014-12-13 15:25:46

相關問題