2017-03-10 23 views
0

我想要獲得更多直覺,瞭解列表的可變性如何在Python中工作。特別是,我通過一份聲明中this source困惑:關於列表在Python中可變性的困惑

如果需要排序列表,或者按字母或數字,Python已經爲你披上那裏。只需調用列表上的sort()方法,它將按照新的順序保存。這將覆蓋前面的列表,因此如果您需要保留原件,請創建一個副本進行排序。

我不確定我是否理解如何以粗體顯示該零件。以下是我在談論的一個例子:

>>> x = [3,2,1,0] 
>>> y = x 
>>> x 
[3,2,1,0] 
>>> y 
[3,2,1,0] 
>>> y.sort() 
>>> y 
[0,1,2,3] 
>>> x 
[0,1,2,3] 

所以我創建了一個副本進行排序,然後排序的副本,但這種情況已經改變了原來的列表中。因此,我對上面的引用意味着什麼感到困惑。我不明白這是如何「保留原來的」。有沒有特別的方法來複制?謝謝。

+1

'Y = x'不創建副本更改任何值的另一個參考,它只是意味着該列表現在有兩個不同的名字。 –

回答

2

使用y = list(x)創建一個新列表。否則,您只需獲得對同一列表對象的新引用。

1

您是複製x的引用

你可以試試deepcopy有一些樂趣

import copy 

x = [3,2,1,0] 
y = copy.deepcopy(x) 
y.sort() 
print x 
1

你應該想到這些語句的

x = [3,2,1,0] 
y = x 

爲複製到列表的引用由x指向y的對象。

由於兩個變量都是對同一個對象的引用,所以排序y會導致對x和y所指向的對象進行排序。

達到你想要它會更容易使用,創建列表的排序複印功能的行爲

y = sorted(x) 

或文檔說先創建一個副本,並就地排序複印

y = x[:] 
y.sort() 

y = list(x) 
y.sort() 
1

當您說y = x時,您不僅僅是將x中的數據複製到y;您將名稱y分配給x指向的相同基礎數據。也就是說,您僅僅創建了另一個名稱y,通過它可以引用x已經引用的數據。因此,當您撥打y.sort()時,您還無意中對x進行了排序,因爲它們引用了相同的基礎數據。

您可以複製通過x引用的數據和名爲yy = list(x)y = x[:]引用副本,然後排序y不會影響x,因爲他們是真正不同的對象。或者,您可以使用非變異排序功能:x_sorted = sorted(x)

0

你應該看看什麼是shallow copydeep copy。這應該能夠給你解決方法,爲什麼你的複製方式無法正常工作。

編號:https://docs.python.org/2/library/copy.html

所以,當你說y = x,這意味着要複製的參考。但不完全創建具有不同參考的另一個列表。

y = copy.deepcopy(x)是深拷貝,這將創造y.所以修改y不會x.