av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python列表嵌套常見坑點及解決方案

瀏覽:4日期:2022-07-09 11:13:53

1.嵌套列表

Python中有一種內(nèi)置的數(shù)據(jù)類型叫列表(list),它是一種容器,可以用來承載其他的對象(準確的說是其他對象的引用),列表中的對象可以稱為列表的元素,很明顯我們可以把列表作為列表中的元素,這就是所謂的嵌套列表。

嵌套列表可以模擬出現(xiàn)實中的表格、矩陣、2D游戲的地圖(如植物大戰(zhàn)僵尸的花園)、棋盤(如國際象棋、黑白棋)等。

2.識別坑點

在使用嵌套的列表時要小心,否則很可能遭遇非常尷尬的情況,下面是一個小例子。

def main(): names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[0] * 3] * 5 for row, name in enumerate(names): print(’請輸入%s的成績’ % name) for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main() names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[0] * 3] * 5 for row, name in enumerate(names): print(’請輸入%s的成績’ % name) for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main()

我們希望錄入5個學生3門課程的成績,于是定義了一個有5個元素的列表,而列表中的每個元素又是一個由3個元素構(gòu)成的列表,這樣一個列表的列表剛好跟一個表格是一致的,相當于有5行3列。

接下來我們通過嵌套的for-in循環(huán)輸入每個學生3門課程的成績。程序執(zhí)行完成后我們發(fā)現(xiàn),每個學生3門課程的成績是一模一樣的(尷尬),而且就是最后錄入的那個學生的成績。

3。區(qū)分兩個概念

要想把這個坑填平,我們首先要區(qū)分對象和對象的引用這兩個概念,而要區(qū)分這兩個概念,還得先說說內(nèi)存中的棧和堆。

我們經(jīng)常會聽人說起“堆棧”這個詞,但實際上“堆”和“棧”是兩個不同的概念。眾所周知,一個程序運行時需要占用一些內(nèi)存空間來存儲數(shù)據(jù)和代碼,那么這些內(nèi)存從邏輯上又可以做進一步的劃分。

對底層語言(如C語言)有所了解的程序員大都知道,程序中可以使用的內(nèi)存從邏輯上可以為五個部分,按照地址從高到低依次是:棧(stack)、堆(heap)、數(shù)據(jù)段(data segment)、只讀數(shù)據(jù)段(static area)和代碼段(code segment)。

棧用來存儲局部、臨時變量,以及函數(shù)調(diào)用時保存現(xiàn)場和恢復現(xiàn)場需要用到的數(shù)據(jù),這部分內(nèi)存在代碼塊開始執(zhí)行時自動分配,代碼塊執(zhí)行結(jié)束時自動釋放,通常由編譯器自動管理。

堆的大小不固定,可以動態(tài)的分配和回收,因此如果程序中有大量的數(shù)據(jù)需要處理,這些數(shù)據(jù)通常都放在堆上,如果堆空間沒有正確的被釋放會引發(fā)內(nèi)存泄露的問題,而像Python、Java等編程語言都使用了垃圾回收機制來實現(xiàn)自動化的內(nèi)存管理(自動回收不再使用的堆空間)。

4。小例子

所以,下面的代碼中,變量a并不是真正的對象,它是對象的引用,相當于記錄了對象在堆空間的地址,通過這個地址我們可以訪問到對應(yīng)的對象。

a = object()b = [’apple’, ’pitaya’, ’grape’]b = [’apple’, ’pitaya’, ’grape’]

同理,變量b是列表容器的引用,它引用了堆空間上的列表容器,而列表容器中并沒有保存真正的對象,它保存的也僅僅是對象的引用。

知道了這一點,我們可以回過頭看看剛才的程序,我們對列表進行[[0]* 3] * 5操作時,僅僅是將[0, 0, 0] 這個列表的地址進行了復制,并沒有創(chuàng)建新的列表對象。

所以,容器中雖然有5個元素,但是這5個元素引用了同一個列表對象。這一點可以通過id函數(shù)檢查scores[0]和scores[1]的地址得到證實。在此我們舉一個小例子,讀者朋友們可以敲一敲加深印象。

a = [[0]*3]*5id(a[0])id(a[1])# id相等id(a[1])# id相等

5。正確代碼

所以,正確的代碼應(yīng)該按照如下的方式進行修改。

def main(): names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[]] * 5 for row, name in enumerate(names): print(’請輸入%s的成績’ % name) scores[row] = [0] * 3 #變?yōu)椴辉偾短? for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main()’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[]] * 5 for row, name in enumerate(names): print(’請輸入%s的成績’ % name) scores[row] = [0] * 3 #變?yōu)椴辉偾短? for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main()

或者

def main(): names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[0] * 3 for _ in range(5)] for row, name in enumerate(names): print(’請輸入%s的成績’ % name) scores[row] = [0] * 3 for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main() names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學’, ’英語’] scores = [[0] * 3 for _ in range(5)] for row, name in enumerate(names): print(’請輸入%s的成績’ % name) scores[row] = [0] * 3 for col, subj in enumerate(subjs): scores[row][col] = float(input(subj + ’: ’)) print(scores)if __name__ == ’__main__’: main()

以上就是使用嵌套列表需要注意的問題及解決措施,希望大家多多總結(jié),以此避免在使用嵌套列表或者復制對象時可能遇到的坑。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 五月激情婷婷网 | 国产一级在线 | 在线观看涩涩视频 | 精品视频一区二区三区 | 国产精品久久久久久久岛一牛影视 | 一区二区三区四区在线视频 | 国产精品视频网 | 免费观看一级毛片视频 | 久久综合av | 国产欧美日韩一区二区三区在线 | 成人国产免费观看 | 久久精品一 | 午夜99| 91精品久久久久久综合五月天 | 国产在线一区观看 | 丁香婷婷综合激情五月色 | 久久99精品久久久久久噜噜 | 欧美精品在线观看 | 亚洲精品电影 | av免费看在线 | 99免费| 日韩成人在线电影 | 国产精品一区二区三区在线 | 久久久久久久亚洲精品 | 国产一区二区免费在线 | 欧美国产日韩在线观看 | 91久久国产综合久久 | 日韩国产欧美一区 | 一级欧美 | 成人精品鲁一区一区二区 | 国产精品污www一区二区三区 | 国产精品视频免费 | av一二三区 | 99reav| 成人免费淫片aa视频免费 | 天天干天天谢 | 婷婷不卡 | 91九色在线观看 | 碰碰视频| a在线免费观看 | 爱爱视频在线观看 |