国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 多維List創建的問題小結

2020-02-16 00:43:35
字體:
來源:轉載
供稿:網友

背景

最近在學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)]

測試發現問題解決。

創建二維數組的辦法

直接創建法

test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]

簡單粗暴,不過太麻煩,一般不用。

列表生成式法

test = [[0 for i in range(m)] for j in range(n)]

學會使用列表生成式,終生受益。

使用模塊numpy創建

import numpy as nptest = np.zeros((m, n), dtype=np.int)

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 景宁| 双鸭山市| 吴江市| 腾冲县| 宁强县| 托克逊县| 莫力| 衡阳县| 东乌珠穆沁旗| 容城县| 平安县| 灌阳县| 萝北县| 芜湖县| 会东县| 体育| 昌乐县| 霍邱县| 铅山县| 吉安县| 陆河县| 宜良县| 九龙坡区| 青岛市| 酉阳| 班戈县| 诏安县| 龙海市| 五指山市| 五大连池市| 额尔古纳市| 绥德县| 松桃| 汝阳县| 岐山县| 白山市| 许昌县| 工布江达县| 酒泉市| 苍溪县| 日照市|