返回顶部
首页 > 资讯 > 后端开发 > Python >python列表嵌套引发的问题总结
  • 148
分享到

python列表嵌套引发的问题总结

2024-04-02 19:04:59 148人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.嵌套列表2.识别坑点3.区分两个概念4.小例子5.正确代码总结1.嵌套列表 python中有一种内置的数据类型叫列表(list),它是一种容器,可以用来承载其他的对象(准确的

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

我们希望录入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是列表容器的引用,它引用了堆空间上的列表容器,而列表容器中并没有保存真正的对象,它保存的也仅仅是对象的引用。

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

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

a = [[0]*3]*5id(a[0])
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()

或者:

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列表嵌套内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python列表嵌套引发的问题总结

本文链接: https://lsjlt.com/news/118197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python列表嵌套引发的问题总结
    目录1.嵌套列表2.识别坑点3.区分两个概念4.小例子5.正确代码总结1.嵌套列表 Python中有一种内置的数据类型叫列表(list),它是一种容器,可以用来承载其他的对象(准确的...
    99+
    2024-04-02
  • Python实现嵌套列表的7中方法总结
    目录模拟数据方式1:for循环方式2:列表推导式方式3:使用itertools库方式4:使用sum函数方式5:Python自加方式6:extend函数方式7:使用递归函数后续大家好,...
    99+
    2023-03-03
    Python实现嵌套列表方法 Python实现嵌套列表 Python嵌套列表
  • 浅谈Python列表嵌套字典转化的问题
    在看视频教程的时候提到了[{'a' : 97}, {'b' : 98}, {'c' : 99}, {'d' : 100}, {'e' : 101}, ...........]形式的列...
    99+
    2024-04-02
  • python中字典和列表的相互嵌套问题详解
    目录1.列表中存储字典:1.列表中存储多个字典2.访问列表中字典的值3.遍历访问多个值2.字典中存储列表1.访问字典中的列表元素2.访问字典中的值(字典中的值为列表)3.字典中存储字...
    99+
    2024-04-02
  • Python-嵌套列表list的全面解析
    一个3层嵌套列表m m=["a",["b","c",["inner"]]] 需要解析为基本的数据项a,b,c,inner 基本的取数据项方法: for i in m: print i这个只能取出第一层的a...
    99+
    2022-06-04
    嵌套 列表 Python
  • Python列表推导式和嵌套的列表推导式
    列表推导式提供了一个更简单的创建列表的方法。常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。 例如,假设我们想创建一个平方列表,像这样 >>...
    99+
    2023-01-31
    列表 嵌套 Python
  • PYTHON压平嵌套列表的简单实现
    list 是 Python 中使用最频繁的数据类型, 标准库里面有丰富的函数可以使用。 不过,如果把多维列表转换成一维列表(不知道这种需求多不多),还真不容易找到好用的函数, 要知道Ruby、Mathe...
    99+
    2022-06-04
    嵌套 简单 列表
  • [python] 列表的练习总结
    1bicycles = ['trek', 'cannondale', 'redline', 'specialized']print(bicycles)print(bicycles[0]) ##第一个列表数据print(bicycles[0]...
    99+
    2023-01-31
    列表 python
  • python如何提取列表嵌套字典的值
    要提取列表嵌套字典中的值,可以使用循环结构来遍历列表和字典,并使用字典的键来访问对应的值。以下是一个示例代码:```pythonda...
    99+
    2023-09-26
    python
  • python列表嵌套元组的方法是什么
    在Python中,可以使用列表嵌套元组的方法来创建一个包含多个元组的列表。列表嵌套元组可以通过以下几种方式创建: 直接在列表中定...
    99+
    2023-10-22
    python
  • Python实现嵌套列表的方法有哪些
    这篇文章主要讲解了“Python实现嵌套列表的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python实现嵌套列表的方法有哪些”吧!模拟数据data = [[...
    99+
    2023-07-05
  • 关于Python列表的索引取值问题
    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了Python 列表的索引取值,本节重点掌握多次索引取值的语法:列表[索引][索引],结合示例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。php零基础到就业直播视...
    99+
    2024-04-02
  • SSH系列:(21)Session过期,登录页面嵌套的问题
    在系统中使用了frameset,当前用户的系统登录信息失效后;如果再点击左边的菜单,那么在右边的显示登录页面,而正确的应该是整个页面返回到登录页。 解决这个问题:应该在跳转到登录页面中使用js脚本...
    99+
    2024-04-02
  • python3启动web服务引发的一系列问题汇总
    目录python3启动web服务引发的一系列问题背景错误信息解决问题安装pip3使用pip 安装tornado最后扩展:用python最新版本安装web3后调试错误原因和解决方法总结...
    99+
    2023-02-24
    python3启动web服务 python启动web服务
  • PYTHON 中使用 GLOBAL引发的一系列问题
    哪里出问题了   python 中,使用 global 会将全局变量设为本函数可用。同时,在函数内部访问变量会先本地再全局。   在嵌套函数中,使用 global 会产生不合常理的行为。   上代码: ...
    99+
    2022-06-04
    系列 PYTHON GLOBAL
  • Python 避免字典和元组的多重嵌套问题
    目录一、字典、元组的多重嵌套二、嵌套结构重构为类一、字典、元组的多重嵌套 例 1:记录全班学生的成绩。 分析:定义一个 SimpleGradebook类, 学生名是字典self._g...
    99+
    2024-04-02
  • python中列表的常见操作梳理总结(二)
    目录python中列表的常见操作列表的索引与切片什么是索引?什么是切片?列表通过索引/切片赋值及索引的获取pop函数删除元素索引&切片在元组中的特殊性字符串的索引与切片字符串...
    99+
    2024-04-02
  • python中列表的常见操作梳理总结(一)
    目录python中列表的常见操作列表元组的简单操作列表/元组的长度列表/元组之间的累加与乘法判断列表/元组中是否包含某元素列表的append()函数列表的insert()函数列表的c...
    99+
    2024-04-02
  • python判断列表为空的三种方法总结
    目录python中判断列表为空方法1:len()方法2:直接使用if判断方法3:使用==进行判断python判断为空的处理总结python中判断列表为空 判断列表为空是一个非常基础的...
    99+
    2023-02-03
    python判断列表为空 python判断列表 python空列表判断
  • 详细总结Python常见的安全问题
    目录一、输入注入二、assert 语句(Assert statements)三、计时攻击(Timing attacks)四、临时文件(Temporary files)五、使用 yam...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作