當我輸入下面的代碼,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是什麼時候?
當我輸入下面的代碼,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是什麼時候?
你沒有變異(變化)的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]
>>>
您創建了一個新的列表對象並綁定到同一個名字,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。
您並未更改列表,您正在創建一個新列表並將其分配給名稱x
。這就是爲什麼id
給你不同的輸出。你的第一個列表不見了,並且會被垃圾收集(除非在別的地方有另一個引用)。
您不會改變列表,您正在創建一個新列表並將其分配給名稱x。這就是爲什麼ID給你不同的輸出。
你的第一個列表已經消失並且將被垃圾收集(除非另有引用)。 來源:上面的答案。
複製上面的答案。這不是你的答案! –
@iCodez的答案是現貨。您應該仔細閱讀Python文檔的[「命名和綁定」部分](https://docs.python.org/2/reference/executionmodel.html#naming-and-binding),它可以準確解釋什麼時候發生了什麼Python執行一個賦值語句,'variable_name = ...' –