[問題] 關於對list重複append的問題

作者: kanako (我是香民)   2021-09-14 23:29:49
各位好
最近工作時需要產生一組list,規則如下
N=0 輸出空list
N=1 輸出[[1]]
N=2 輸出[[0,0], [1,0], [2,0], [0,1], [1,1], [2,1], [0,2], [1,2], [2,2]]
依此類推
以下是我的code(輸出會缺[0,0])
N=2
series = [0] * N
result = []
while sum(series) != N*N:
for i in range(N):
if series[i] < N:
series[i] += 1
break
else:
series[i] = 0
print(series) #此處的輸出都是正確的
result.append(series)
print(result) #每次append都會蓋過前面的元素
結果result裡面的值是
[[2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]
第一次遇到這種狀況,我找不到result的值何時被重設,append也不應該蓋過前面的值
請問一下各位高手,我的code錯誤在那邊,感謝
作者: s0914714 (YA)   2021-09-14 23:52:00
result要用extend
作者: cuteSquirrel (松鼠)   2021-09-14 23:54:00
倒數第二行改成 result.append(series[::])
作者: s0914714 (YA)   2021-09-14 23:56:00
抱歉 2樓才是對的
作者: cuteSquirrel (松鼠)   2021-09-14 23:56:00
原因是series實際上是一個reference,舊的寫法會因為series一直計算更新內容,導致result只會指向最後一次計算結果,也就是[2,2]
作者: TitanEric (泰坦)   2021-09-15 00:21:00
不要用* 用list comprehension
作者: lycantrope (阿寬)   2021-09-15 07:34:00
list還可以包含list自身就會[...]
作者: poototo (poototo)   2021-09-16 08:41:00
* 要注意就是了,看自己對可變容器的用法需求
作者: garyhsu1209 (良師)   2021-09-17 22:07:00
result = [[i, j] for i in range(3) for j in range(3)]一行收工我[i ,j]寫反了,要改成[j, i]

Links booklink

Contact Us: admin [ a t ] ucptt.com