痾......我知道這種坑不該踩,但我還是踩了
題目本身不難,沒有用特別恐怖的資料逼你用特殊的演算法,直接暴力解就可以
我的解題思路是先做出一個空陣列,用來保存風險值,所有值都為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)