电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Python列表嵌套常見坑點(diǎn)及解決方案

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

1.嵌套列表

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

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

2.識別坑點(diǎn)

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

def main(): names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學(xué)’, ’英語’] 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ù)學(xué)’, ’英語’] 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個學(xué)生3門課程的成績,于是定義了一個有5個元素的列表,而列表中的每個元素又是一個由3個元素構(gòu)成的列表,這樣一個列表的列表剛好跟一個表格是一致的,相當(dāng)于有5行3列。

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

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

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

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

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

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

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

4。小例子

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

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

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

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

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

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

5。正確代碼

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

def main(): names = [’關(guān)羽’, ’張飛’, ’趙云’, ’馬超’, ’黃忠’] subjs = [’語文’, ’數(shù)學(xué)’, ’英語’] 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ù)學(xué)’, ’英語’] 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ù)學(xué)’, ’英語’] 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ù)學(xué)’, ’英語’] 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é),以此避免在使用嵌套列表或者復(fù)制對象時可能遇到的坑。

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网| 紧急切断阀_气动切断阀_不锈钢阀门_截止阀_球阀_蝶阀_闸阀-上海上兆阀门制造有限公司 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 真空乳化机-灌装封尾机-首页-温州精灌 | 全屋整木定制-橱柜,家具定制-四川峨眉山龙马木业有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 广东西屋电气有限公司-广东西屋电气有限公司 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 不锈钢水管-不锈钢燃气管-卫生级不锈钢管件-不锈钢食品级水管-广东双兴新材料集团有限公司 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 上海logo设计| 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 纸箱网 -纸箱机械|设备|包装纸盒|包装印刷行业门户网站 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 防爆鼓风机-全风-宏丰鼓风机-上海梁瑾机电设备有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 |