Python中列表操作函數append的淺拷貝問題

L=int(input())#L位數
N=int(input())#N進位
row=[]
list1=[]
for i in range(1,N):
row.append(1)

list1.append(row)

for i in range(1,L+1):
row.clear()

for n in range(N):
if n==0:
sum=sum(list1[i-1])-list1[i-1][n+1]
row.append(sum)
elif n==N-1:
sum=sum(list1[i-1])-list[i-1][n-1]
row.append(sum)
else:
sum=sum(list[i-1])-list[i-1][n-1]-list1[i-1][n+1]
row.append(sum)
print(list1)

問題起源:在做藍橋杯練習時,發現上述程式碼運行時出現list index of range列表越界問題,在debug後發現是因為append函數的淺拷貝:list1在儲存了row列表之後,再運行row.clear() 導致list1中數據被清空,
問題原理:在 Python 中,對象賦值實際上是對象的引用。當創建一個對象,然後把它賦給另一個變數的時候,Python 並沒有拷貝這個對象,而只是拷貝了這個對象的引用,我們稱之為淺拷貝。
append() 函數當 list 類型的對象進行 append 操作時,實際上追加的是該對象的引用。因此使用clear()函數時,把row列表清空的同時,也會把list1列表中的元素清空
解決方法:使用深拷貝:引入copy模組,使用deepcopy()方法,對應的 上述程式碼修改為list1.append(copy.deepcopy(row))