2015-12-21 63 views
5

我老了,沒有頭髮留下來拔出。我已經閱讀了許多類似問題的答案,就像我可以在SO上找到的一樣。我有以下代碼:Python 3.5列表理解修改原始

a = [[1,2],[3,4],[4,5]] 
b = ['a','b','c'] 
print('a:',a) 
print('b:',b) 
c = a[:] 
print('c == a:', c==a) 
print('c is a:',c is a) 
print('id(c) = id(a):', id(c)==id(a)) 
[x.extend(b) for x in c] 
print('c after:',c) 
print('a after:',a)` 

輸出是:

a: [[1, 2], [3, 4], [4, 5]] 
b: ['a', 'b', 'c'] 
c == a: True 
c is a: False 
id(c) = id(a): False 
c after: [[1, 2, 'a', 'b', 'c'], [3, 4, 'a', 'b', 'c'], [4, 5, 'a', 'b', 'c']] 
a after: [[1, 2, 'a', 'b', 'c'], [3, 4, 'a', 'b', 'c'], [4, 5, 'a', 'b', 'c']] 

我找顯示爲結果「C後:」但我不明白爲什麼一個被修改了,太? 我也試過

c = list(a) 

c = copy.copy(a) 

當然,正如所料簡單C = A不起作用。 我錯過了什麼? 謝謝。

回答

7

這是因爲您不復制列表中的元素。不會複製a中的列表。因此,您的extend方法會影響這兩個列表中的元素。您應該使用c = copy.deepcopy(a)來複制嵌套元素。

1

嘗試分配了C列表這樣的,(不.copy()解決方案)

c = [] 
for elem in a: 
    c.append(list(elem)) 

或一個內膽採用列表理解

c = [list(elem) for elem in a] 

,如果您有此列表提供深拷貝名單內,當然不是3層。

你做的失敗的原因是你設法正確地複製列表,但裏面的列表仍然被重新歸爲相同的記憶值,因此在元素列表中沒有拷貝。此解決方案還複製內部列表,這是深度複製的定義。

0

正如其他海報解釋,A內的列表實際上並沒有複製到C - 他們只是參考原始的。你可以看到,當您運行下面的代碼:

num_lists = [[1,2],[3,4],[4,5]] 
lists_copy = num_lists[:] 

orig_first = num_lists[0] 
copy_first = lists_copy[0] 

print('Are the first elements the same object?', orig_first is copy_first) 

它打印「真」,意思是[1,2]內lists_copy實際上是[1,2]從NUM_LISTS。複製Python列表太複雜了,我希望他們在將來更改它更友好。截至目前,你能做的最好的是: lists_copy = copy.deepcopy(num_lists)

你可以看到它下面的工作:

from copy import deepcopy 

lists_copy = deepcopy(num_lists) 

orig_first = num_lists[0] 
copy_first = lists_copy[0] 

print('Are they they the same after copying with deepcopy?', orig_first is copy_first) 

此代碼打印「假」,這意味着該列表被安全地複製和平衡,最終恢復到宇宙:)

0

也考慮到列表是可變類型,可以在創建後修改,而不可變類型例如字符串。不可變類型在創建後無法更改。因此,如果您嘗試附加第二個字符串,則會創建一個字符串的實際副本。可變類型可以更改。因此,沒有複製,並且a和c都引用相同的列表。