2014-06-18 95 views
0

當我輸入下面的代碼,Python列表是否可變?

x=[1,2,4] 
print(x) 
print("x",id(x)) 
x=[2,5,3] 
print(x) 
print("x",id(x)) 

它給人的輸出

[1, 2, 4] 
x 47606160 
[2, 5, 3] 
x 47578768 

如果列表是可變的,那麼爲什麼它給2個內存地址更改列表X是什麼時候?

+0

@iCodez的答案是現貨。您應該仔細閱讀Python文檔的[「命名和綁定」部分](https://docs.python.org/2/reference/executionmodel.html#naming-and-binding),它可以準確解釋什麼時候發生了什麼Python執行一個賦值語句,'variable_name = ...' –

回答

11

你沒有變異(變化)的x與該行引用的列表對象:

x=[2,5,3] 

相反,該行創建了一個新的列表對象,然後重新分配變量x它。所以,現在x引用新的對象和id(x)給出了不同數量比以前:

>>> x=[1,2,4] # x references the list object [1,2,4] 
>>> x 
[1, 2, 4] 
>>> x=[2,5,3] # x now references an entirely new list object [2,5,3] 
>>> x 
[2, 5, 3] 
>>> 
13

您創建了一個新的列表對象並綁定到同一個名字,x。您從未突變開始時綁定到x的現有列表對象。

Python中的名稱只是參考。賦值是將一個名稱綁定到一個對象。當您再次分配給x時,您指向的是對不同對象的引用。在你的代碼中,你只需創建一個全新的列表對象,然後將x反彈回新的對象。

如果你想發生變異列表,該對象上調用方法:

x.append(2) 
x.extend([2, 3, 5]) 

或分配到列表中的索引或切片:

x[2] = 42 
x[:3] = [5, 6, 7] 

演示:

>>> x = [1, 2, 3] 
>>> id(x) 
4301563088 
>>> x 
[1, 2, 3] 
>>> x[:2] = [42, 81] 
>>> x 
[42, 81, 3] 
>>> id(x) 
4301563088 

我們改變了列表對象(改變了它),但是該列表對象的未更改。它仍然是同一個列表對象。

Ned Batchelder對Python名稱和綁定的優秀演示可能有所幫助:Facts and myths about Python names and values

4

您並未更改列表,您正在創建一個新列表並將其分配給名稱x。這就是爲什麼id給你不同的輸出。你的第一個列表不見了,並且會被垃圾收集(除非在別的地方有另一個引用)。

0

您不會改變列表,您正在創建一個新列表並將其分配給名稱x。這就是爲什麼ID給你不同的輸出。

你的第一個列表已經消失並且將被垃圾收集(除非另有引用)。 來源:上面的答案。

+0

複製上面的答案。這不是你的答案! –

相關問題