我剛剛開始編程,正在努力通過Python的「如何像計算機科學家一樣思考」。我在第9章參加練習之前一直沒有任何問題:克隆和深度拷貝之間的區別?
def add_column(matrix):
"""
>>> m = [[0, 0], [0, 0]]
>>> add_column(m)
[[0, 0, 0], [0, 0, 0]]
>>> n = [[3, 2], [5, 1], [4, 7]]
>>> add_column(n)
[[3, 2, 0], [5, 1, 0], [4, 7, 0]]
>>> n
[[3, 2], [5, 1], [4, 7]]
"""
代碼應該使上面的doctest通過。我在最後一次測試中遇到困難:讓原始列表不受影響。我擡起頭的解決方案,這是以下情況:
x = len(matrix)
matrix2 = [d[:] for d in matrix]
for z in range(x):
matrix2[z] += [0]
return matrix2
我的問題是:爲什麼不能下聯是:
matrix2 = matrix[:]
當這條線是代替原來的列表被編輯包括添加元素。 「如何成爲...」指南使其聽起來像克隆創建了一個新列表,可以在不影響原始列表的情況下對其進行編輯。如果那是真的,這裏發生了什麼?如果我使用:
matrix2 = copy.deepcopy(matrix)
一切工作正常,但我並沒有印象,克隆會失敗下... 任何幫助將不勝感激!
感謝您的幫助 - 我想我在這一點上理解。是否有任何理由爲什麼要製作一個矩陣的離散副本,但保持嵌套列表引用同一個對象?我並沒有深入到這個過程中來預測這將是什麼,除了混淆之外...... – Alxmrg 2012-04-27 18:10:09
這不是一個設計決定,更多的是對Python的工作方式的反響。無論何時使用Python進行賦值,您都不會複製該對象,只需將該變量指定爲引用即可。任意做別的事情都沒有意義。 – 2012-04-27 18:14:43