Python 多維List建立的問題

2021-09-12 21:58:36 字數 1069 閱讀 6065

最近在學python,我覺得學習乙個新語言最好的方式就是寫乙個簡單的專案,所以就打算寫乙個簡單的俄羅斯方塊遊戲。那麼在寫的過程中遇到了乙個小問題。

def __init__(self, width = 10, height = 30):

self.width, self.height = width, height

self.board_size = [width, height]

我用乙個二維list來記錄遊戲空間的狀態,game_boardx代表乙個格仔,0代表這格仔是空的,1代表不是。很顯然,初始化的時候應該將所有的格仔都賦值為0。查詢了一下list的相關文件,發現可以用[0] * n這樣的方式來快速建立特定長度的list,因此很自然的寫出了下面這行**。

self.game_board = [[0] * height] * width
檢視一下結果,確實建立了長寬符合預期、值全部都是0的乙個二維list,感覺沒什麼問題,就接著往下寫了。

但這兩天在寫消除方法的時候,使用最下面3排全是1,第四排中間是1其他全是0,這樣消除完成之後應該還剩1個1掉落到第一排。但測試過程中發現無論如何都會導致所有的1都被消除了,一開始我還以為是消除的演算法有問題,但後來在每一步過程中都監控整個game_board的狀態時才發現,當一橫排有乙個值為1的時候,這一橫排所有值都自動變成1了。

很自然的就想到,這是由於list物件的引用產生的。[0] * height產生了長度為height並且內容全是0的list,由於0是個int,是基礎資料型別,因此這樣使用是正確的。但用這個list去進行* width操作時,產生的都是這個list的引用,而不是新建了width個list,所以修改其中任意乙個就全部都修改了。

經過查閱python文件,將**修改為:

self.game_board = [([0] * height) for i in range(width)]
測試發現問題解決。

其實是很基礎的問題,對於python *這個運算子不夠了解,因此想當然覺得代表了對物件進行深拷貝。而且可能前端做多了,對資料結構這種基礎不太敏感了吧,還是要多做練習啊。

python多維list去重

一維的list去重可以用set list 但是二維的list轉set就會報錯 unhashable type list 原因是set傳進來的是不可雜湊的變數 python中那麼哪些是可雜湊元素?哪些是不可雜湊元素?可雜湊的元素有 int float str tuple 不可雜湊的元素有 list s...

python建立多維列表

by francis hao mar 24,2018 操作符可以用於列表,表示將列表內容重複n次。如下,但是當列表內容是列表的時候就出問題了,如果我只是修改多維列表中的一項,結果是所有的都改變了,如下 這是因為,操作符相當於 淺複製 的概念。只複製了乙個 指標 過去,如下 這個時候如果修改複製後的內...

初始化Python多維列表(list)的坑

刷題過程中採用兩種方式對乙個多維列表進行初始化,最後得到的結果不同,很是疑惑,後來發現兩種初始化方式是有區別的!capacity 10num 5valueexcel 0for j in range capacity 1 for i in range num 1 valueexcel2 0 capac...