1.嵌套列表

Python中有一种内置的数据类型叫列表(list),它是一种容器,可以用来承载其他的对象(准确的说是其他对象的引用),列表中的对象可以称为列表的元素,很明显我们可以把列表作为列表中的元素,这就是所谓的嵌套列表。

嵌套列表可以模拟出现实中的表格、矩阵、2D游戏的地图(如植物大战僵尸的花园)、棋盘(如国际象棋、黑白棋)等。

2.识别坑点

在使用嵌套的列表时要小心,否则很可能遭遇非常尴尬的情况,下面是一个小例子。

def main(): names = ['关羽', '张飞', '赵云', '马超', '黄忠'] subjs = ['语文', '数学', '英语'] 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 = ['关羽', '张飞', '赵云', '马超', '黄忠']

subjs = ['语文', '数学', '英语']

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个元素构成的列表,这样一个列表的列表刚好跟一个表格是一致的,相当于有5行3列。

接下来我们通过嵌套的for-in循环输入每个学生3门课程的成绩。程序执行完成后我们发现,每个学生3门课程的成绩是一模一样的(尴尬),而且就是最后录入的那个学生的成绩。

3。区分两个概念

要想把这个坑填平,我们首先要区分对象和对象的引用这两个概念,而要区分这两个概念,还得先说说内存中的栈和堆。

我们经常会听人说起“堆栈”这个词,但实际上“堆”和“栈”是两个不同的概念。众所周知,一个程序运行时需要占用一些内存空间来存储数据和代码,那么这些内存从逻辑上又可以做进一步的划分。

对底层语言(如C语言)有所了解的程序员大都知道,程序中可以使用的内存从逻辑上可以为五个部分,按照地址从高到低依次是:栈(stack)、堆(heap)、数据段(data segment)、只读数据段(static area)和代码段(code segment)。

栈用来存储局部、临时变量,以及函数调用时保存现场和恢复现场需要用到的数据,这部分内存在代码块开始执行时自动分配,代码块执行结束时自动释放,通常由编译器自动管理。

堆的大小不固定,可以动态的分配和回收,因此如果程序中有大量的数据需要处理,这些数据通常都放在堆上,如果堆空间没有正确的被释放会引发内存泄露的问题,而像Python、Java等编程语言都使用了垃圾回收机制来实现自动化的内存管理(自动回收不再使用的堆空间)。

4。小例子

所以,下面的代码中,变量a并不是真正的对象,它是对象的引用,相当于记录了对象在堆空间的地址,通过这个地址我们可以访问到对应的对象。

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

b = ['apple', 'pitaya', 'grape']

同理,变量b是列表容器的引用,它引用了堆空间上的列表容器,而列表容器中并没有保存真正的对象,它保存的也仅仅是对象的引用。

知道了这一点,我们可以回过头看看刚才的程序,我们对列表进行[[0]* 3] * 5操作时,仅仅是将[0, 0, 0] 这个列表的地址进行了复制,并没有创建新的列表对象。

所以,容器中虽然有5个元素,但是这5个元素引用了同一个列表对象。这一点可以通过id函数检查scores[0]和scores[1]的地址得到证实。在此我们举一个小例子,读者朋友们可以敲一敲加深印象。

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

id(a[1])

# id相等

5。正确代码

所以,正确的代码应该按照如下的方式进行修改。

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()'关羽', '张飞', '赵云', '马超', '黄忠']

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()

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列表嵌套常见坑点及解决方案相关推荐

  1. python 列表嵌套字典 添加修改删除_python 列表、字典、元组等增删改查

    1. 元组 a. 定义和下标访问 元组的格式: (值,....) 如 s = (1,2,3) 元组的类型: tuple 元组的下标使用同字符串 注意:如果元组中只有一个元素,那么在定义时,需要加一个逗 ...

  2. python购物车程序详解用字典_Python_购物车程序[列表嵌套字典]

    1 product = [{"名称": "电脑", "价格": 999, '数量': 0}, {"名称": " ...

  3. python处理列表中字典_Python列表嵌套字典的时候,如果要删除列表中其中一个字典要如何操作...

    如果要删除列表中其中一个字典要操作如下 第一种方法 1.1 name_list=[{"name":"张三","age":18},{" ...

  4. python中不能使用下标运算的有哪些_Python中最常见的10个问题(列表)

    列表是Python中使用最多的一种数据结果,如何高效操作列表是提高代码运行效率的关键,这篇文章列出了10个常用的列表操作,希望对你有帮助. 注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮 ...

  5. python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...

    函数的对象 python中一切皆对象 函数对象的四大功能 引用 def f1(): print("from f1") f1() #调用函数 print(f1) print(&quo ...

  6. python列表嵌套字典取值_Python基础语法:你不得不知的几种变量类型

    (点击上方快速关注并设置为星标,一起学Python) 作者:kina_chen來源:简书 01. Python编码Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字, ...

  7. python 清空所有对象_Python编程思想(7):列表的增删改操作

    李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法.读者可以在「极客起源」 公众号中输入 160 ...

  8. 【学习笔记】34、函数是Python的头等对象

    函数是Python的头等对象 我们可以把函数分配给变量.存储在数据结构中.作为参数传递给其他函数,甚至作为其他函数的返回值等. 函数是对象 Python程序中所有的数据都是由对象或者对象之间的关系来表 ...

  9. python 列表嵌套字典 添加修改删除_【Python】列表嵌套字典修改字典里面的一个值却把全部的值都修改了。...

    具体问题就是:当我往空列表里面添加字典,需要修改其中的一个键的值的时候,出现把其他同类的值也修改了. 下面就是出现问题的代码: aliens = [] new_alien = {"color ...

最新文章

  1. C# winform 编写记事本
  2. 批量修改MSSQL架构名称
  3. LeetCode 1156. 单字符重复子串的最大长度
  4. 台式临床化学分析仪行业调研报告 - 市场现状分析与发展前景预测
  5. mbot编程机器人怎么连接蓝牙_台式机蓝牙怎么连接
  6. 1049. Counting Ones
  7. 知到计算机绘图网课答案,计算机绘图知到网课答案
  8. Ubuntu18.04添加vim配置
  9. nacos运行报jar的错Failed to get nested archive for entry BOOT-INF/lib/XXX.jar
  10. 2022美国大学生数学建模竞赛C题摘要及总结
  11. [Java]用Random类来模拟双色球开奖
  12. 【总结】举例说明数据库自增字段的 3 种实现方式
  13. 【大厂智力题】飞机加油问题
  14. 最新研究表明:熬夜会增加患癌症几率
  15. 唯爱kindle paperwhite 2
  16. 《计算传播学导论》读书笔记:第七章 数据新闻
  17. Chirp信号研究中的基础问题
  18. 【转】Excel中的Vlookup等函数用法
  19. 大数据平台关键功能设计
  20. linux下挂载共享目录,linux mount挂载共享目录详解

热门文章

  1. matlab 高级函数 —— ind2sub、kron
  2. CentOS + PyCharm 环境下使用 LIBSVM(及 unresolved reference 问题的解决)
  3. 标准模板库(STL)之 priority_queue 列传
  4. Python 数据结构与算法——插入排序(insertion sort)
  5. python数据分析-Python数据分析从小白到高手的几个步骤
  6. 你都用python来做什么-你都用Python来做什么?看看网友们的各种牛X操作
  7. 5岁自学python编程-一张图告诉你孩子学编程怎么选
  8. python爬虫怎么赚钱-如何利用python爬虫挣钱
  9. python爬虫步骤-Docker部署Python爬虫项目的方法步骤
  10. 法语:世界上最有辨识度的语言