2016-04-05 102 views
1

讓這個代碼這是y = y + []深拷貝還是淺拷貝?

x = [1, 2, 3, 4, 5, 6] 
y = x 
y = y + [] 

yx一個深或淺拷貝?

+0

隱式副本從來不是Python中的深層副本。 –

+2

這是一個淺拷貝。通常會使用'y = x [:]'或'y = list(x)'來創建副本。 –

回答

7

這是一個淺拷貝,但在這種情況下,有一個沒有任何區別淺層和深層複製,因爲列表中的整數是不可變的。事實上,它們都足夠小,標準Python解釋器(cpython)將緩存它們(每個1是相同的對象),因此深拷貝將具有與淺拷貝相同的內容(內容將是相同的身份,不只是價值)。

3

該行執行列表y的淺表副本:

y = y + [] 

爲什麼你認爲這將是一個深拷貝?

但由於整數是原子和不可變的,術語「複製」並不適用。就你的例子而言,這根本就沒有關係。如果y包含一些對象,是的,那麼它是一個淺拷貝,因爲包含的元素不會被複制。

爲模塊「複製」 Python的手冊包含了您需要了解淺和深拷貝之間的差別的所有信息:https://docs.python.org/3/library/copy.html

1

我不會打電話給你在做什麼複製操作。您正在構建一個新列表y + []並將其分配到名稱y。使用列表上的時候

+操作不會複製任何東西,所以在y的項目和項目在x將是相同的(如在字面上內存相同的對象)。

無論任何列表的內容是否可變,這都成立,不應將可變性引入本討論。

>>> x = [1,2,3,4,5,6] 
>>> y = x 
>>> y = y +[] 
>>> all(a is b for a,b in zip(y,x)) 
True  
>>> x = [[1], [2]] 
>>> y = x 
>>> y = y + [] 
>>> all(a is b for a,b in zip(y,x)) 
True 

提防與可變元素打交道時的唯一的事情就是改變任何可變元素,將會在保持對它們的引用的所有容器中可以看出。

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