#41739: python 我在這題踩的坑 - 生成陣列時,如果之後可能會修改該陣列,則應使用生成式


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 不指定學校
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2024-11-09 20:16:56
k554. 地雷很危險 -- 小億教學題 | From: [123.192.228.253] | 發表日期 : 2024-08-21 23:19

痾......我知道這種坑不該踩,但我還是踩了
題目本身不難,沒有用特別恐怖的資料逼你用特殊的演算法,直接暴力解就可以

我的解題思路是先做出一個空陣列,用來保存風險值,所有值都為0
一開始我是用這種方式建立陣列的

danger = [[0] * B] * A

用複製的方式
對,它確實能夠變成我要的陣列的「模樣」,但有一些問題
如果之後打算修改它,當我修改其中一個值時,就會把我修改的值也一起複製了,最後就是一改就是改一整排,而非針對某一個座標修改內容

正確的做法應該是使用生成式

danger = [[0 for _ in range(B)] for _ in range(A)]

這樣才可以避免複製的情況發生

 

But why?

有兩個原因
danger = [[0] * B] * A 這種方式本質上並非創建一個列表,而是複製列表。

在 python 中,複製有分成賦值、淺複製深複製,而 * 在這裡的作用是淺複製,這就是更底層的原因,和 python 管理記憶體的方式有關

細節可以看這篇(淺談Python的物件複製:賦值(Assignment)、淺層複製(Shallow Copy)與深層複製(Deep Copy) | SeanLee Tech)

 
ZeroJudge Forum