python嵌套循环注意事项,python嵌套列表怎么遍历
本文主要介绍python列表嵌套带来的问题总结。以下问题来自日常工作总结,有一定参考价值的朋友可以参考一下。
00-1010 1.嵌套列表2。识别坑3。区分两个概念。小例子5。正确代码汇总
目录
Python中有一个内置的数据类型叫做list,它是一个容器,可以用来存放其他对象(准确的说是对其他对象的引用)。列表中的对象可以称为列表的元素。显然,我们可以将列表作为列表中的一个元素,这就是所谓的嵌套列表。
嵌套列表可以模拟表格、矩阵、2D游戏地图(如植物大战僵尸花园)、棋盘(如国际象棋、黑白棋)等。
1.嵌套列表
使用嵌套列表时要小心,否则你可能会遇到非常尴尬的情况,下面是一个小例子:.
定义主():
Names=[关羽,张飞,赵云,马超,黄忠]
Subjs=[中文,数学,英文]
分数=[[0] * 3] * 5
对于行,枚举(名称):中的名称
打印(请输入%s% name 的等级
对于列,枚举中的subj(subjs):
scores[row][col]=float(input(subj : ))
打印(分数)
if __name__==__main__:
主()
我们要输入五个学生三门课的成绩,所以我们定义了一个包含五个元素的列表,列表中的每个元素都是一个包含三个元素的列表。这样的列表的列表就和表格一样,相当于五行三列。
接下来,我们通过嵌套的for-in循环输入每个学生的三门课程的分数。程序执行后,我们发现每个学生三门课的成绩都是一模一样的(尴尬),而且是最后一个学生进的成绩。
2.识别坑点
要填补这个漏洞,首先要区分对象和对象引用这两个概念。要区分这两个概念,首先要说内存中的栈和堆。
我们经常听到人们谈论“栈”这个词,但实际上“堆”和“栈”是两个不同的概念。众所周知,程序运行时需要占用一定的内存空间来存储数据和代码,所以内存在逻辑上可以进一步划分。
大多数懂底层语言(比如C语言)的程序员都知道,一个程序可以使用的内存在逻辑上可以分为五个部分,从大到小依次是:堆栈、堆、数据段、只读数据区、代码段。
Stack用于存储局部和临时变量,以及调用函数时保存和恢复场景所需的数据。这部分内存在代码块开始执行时自动分配,在代码块执行结束时自动释放,通常由编译器自动管理。
堆的大小是不固定的,所以可以动态地分配和回收。因此,如果程序中有大量数据需要处理,这些数据通常会放在堆中。如果没有正确释放堆空间,就会造成内存泄漏的问题。像Python和Java这样的编程语言都是利用垃圾回收机制来实现自动内存管理(自动回收未使用的堆空间)。
3.区分两个概念
所以,在下面的代码中,变量A并不是一个真实的对象,它是一个对对象的引用,相当于记录了对象在堆空间中的地址,通过这个地址我们可以访问对应的对象。
a=对象()
b=[苹果,火龙果,葡萄]
同样,变量B是对列表容器的引用,它引用堆空间上的列表容器,但列表容器并不保存真正的对象,它只保存对对象的引用。
了解了这些,我们就可以回头看看刚才的节目了。当我们在list上操作[[0]* 3] * 5时,我们只是复制了[0,0,0]的地址,并没有创建新的list对象。
因此,尽管容器中有五个元素,但这五个元素引用同一个list对象。这可以通过用id函数检查scores[0]和scores[1]的地址来确认。这里举个小例子,读者朋友可以敲一下加深印象。
a=[[0]*3]*5id(a[0])
id(a[1])
# id等于
4.小例子
.正确代码
所以,正确的代码应该按照如下的方式进行修改:
def main():names = [关羽, 张飞, 赵云, 马超, 黄忠]
subjs = [语文, 数学, 英语]
scores = [[]] * 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()
或者:
def main():names = [关羽, 张飞, 赵云, 马超, 黄忠]
subjs = [语文, 数学, 英语]
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()
总结
本文介绍使用嵌套列表需要注意的问题及解决措施,以此避免在使用嵌套列表或者复制对象时可能遇到的坑。
到此这篇关于python列表嵌套引发的问题总结的文章就介绍到这了,更多相关python列表嵌套内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。