Self-study Python Fish-C Note-5 P20-P26 (part2)

2023-11-16

python 中的列表 Part 2

本文主要讲解了python中列表的使用
本文为自学B站上鱼C的python课程随手做的笔记。
如有问题,欢迎大家批评指正
原视频链接:https://www.bilibili.com/video/BV1c4411e77t?p=8


一. 浅拷贝和深拷贝

(介绍顺序为从0开始理解向,从问题开始最后会说到两者区分)

1. is (is operator, 同一性运算符)

作用:用于检验两个变量是否指向同一个对象的一个运算符。
示例:
请添加图片描述
NB:出现以上情况是因为python对于不同对象的存储机制是不一样的。
对于字符串,由于字符串是不可变的,存储时是在内存中开辟一个位置来存放就好。如果有多个变量名指向一个字符串,那么两者的关系应是:请添加图片描述
对于列表,列表是可变的,尽管例子中x,y两个列表是一样的,但是python还是需要为它们开辟出两个不同的位置来存放,即:
请添加图片描述

2. 一个常见的创建多维列表的错误

导致改了多维列表中一个列表中的元素,其他列表的元素都发生了改动。
演示:
先用创建A,B两个看似相同的多维列表:
请添加图片描述
对多维列表中的一个元素进行修改:
请添加图片描述
我们发现,A按照我们的想法只改动了一个元素,但是B却每一维的第二个元素都发生了变化。
我们用is来判断一下:
请添加图片描述
所以A中的三维的三个列表是分别存储的三个不同列表,B中的是同一个列表的多次引用。即二者的在python中的内存布局应该是:
请添加图片描述
B试图通过乘号对列表进行拷贝,但事实上只是拷贝了同一个列表的引用。

3. 变量不是盒子 (Variables are not boxes)

变量不是一个盒子,当赋值运算发生的时候,python并不是将数据放到变量里去,而是将变量与数据进行挂钩,这个行为我们称之为引用。将一个变量赋值给另一个变量就是将一个变量的引用传递给另一个变量。请添加图片描述
我们发现通过赋值产生的两个列表,当x发生变化时,y也会改变。
两者内存示意图:

请添加图片描述
所以要想得到两个独立的列表,就需要用拷贝。

4. 浅拷贝和深拷贝 shallow and deep copy

  1. 浅拷贝:可以调用列表的copy方法,或者使用切片的方式来实现。
    示例:
    请添加图片描述

此时改变x,y并不会发生改变。这里copy方法拷贝的是整个列表对象,而不仅仅是引用。
示意图:
请添加图片描述

NB: 浅拷贝只是拷贝了外层的对象,如果包含嵌套对象的话,那么拷贝的只是其引用。所以在拷贝多维列表时,浅拷贝就可能出现问题,而深拷贝可以解决这个问题。
(浅拷贝处理一维列表是没有问题的)
示例,处理多维列表时,浅拷贝会出现的问题: 请添加图片描述
请添加图片描述

2. 深拷贝:
深拷贝在将原对象拷贝以后,也将对象中所有引用的子对象一并进行了拷贝。
深拷贝需要借助copy模块里的deepcopy函数。

5. copy模块

(1)copy 函数 (浅拷贝)
可以拷贝列表、字符串、元组等:
copy 实现浅拷贝:
请添加图片描述

(2)deepcopy 函数 (深拷贝)
deepcopy 实现深拷贝:
请添加图片描述
这里的深拷贝内存示意图:
请添加图片描述

二. 列表推导式 (list comprehension expression)

(1)基本语法

  1. a. 基本的一个for循环
[expression for target in iterable]

(1)示例:
请添加图片描述
理解:for循环的语句每次循环都有一个i,列表最终存放的元素取决于for循环语句左侧的expression表达式。 比如以list3为例,for循环把字符串“abcde”中每个字母拿出来,然后列表最终存放的元素是表达式i*2,即每个字母重复一次
(2)更多示例 (嵌套列表):
请添加图片描述
用列表推导式生成嵌套列表:请添加图片描述
2. b. 添加一个用于筛选的if分句

[expression for target in iterable if condition]

示例:
请添加图片描述
执行顺序:
请添加图片描述
应该是先执行for语句,再if,最后再i
比如下面这个例子验证执行顺序:
请添加图片描述
处理字符串:
请添加图片描述
3. c. 列表推导式实现嵌套

 [expression for target1 in iterable1
             for target2 in interable2
             ....
             for targetN in interableN]

示例:
请添加图片描述
注意外层循环放在前面,嵌套内层循环放在后面。
请添加图片描述
4. d. 列表推导式实行多个嵌套且每个for语句都可以加一个if 条件

[expression for target1 in iterable1 if condition1
                     for target2 in iterable2 if condition2
                     ......
                     for targetN in iterableN if conditionN]

请添加图片描述

(2) 列表推导式和for 循环的差别:
请添加图片描述
for 和列表推导式这里都产生了相同的列表,但是两者本质上有区别:
for: 是通过迭代来逐个修改列表里的元素(电视坏了,我们选择去修一下)
列表推导式:直接产生一个新的列表,再赋值回原先的变量名(电视坏了,直接换一个电视)
两者效果多相同,但本质上是不同的。for循环要比列表推导式运算速度上慢很多。

(3) 程序设计要注意KISS(keep it simple and stupid) 原则,列表推导式的复杂程度要好好把握。不要写太复杂的代码不便于维护,简洁胜于复杂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Self-study Python Fish-C Note-5 P20-P26 (part2) 的相关文章

随机推荐

  • ubuntu下x86架构中交叉编译arm架构的程序

    ubuntu下x86架构中交叉编译arm架构的程序 交叉编译工具链安装 操作步骤 我们平时使用的大多数电脑都是英特尔的处理器 使用的是x86架构 因此仿真过程的代码是在x86架构的处理器运行的 但是当我们需要将程序部署到终端用于实物调试时
  • 工作小记:异步线程中事务不生效的问题

    在日常的开发中经常会遇到在线程池或者异常异步中执行自己的业务代码 lz最近在开发业务代码的时候也遇到一个类型的需求 因为请求处理的时间比较长 在设计接口的时候要求异步完成 直接上业务代码 executeOccupyStock 方法也添加了事
  • python并行计算(完结篇):并行方法总结

    转自 https zhuanlan zhihu com p 46678895 由于python相当易学易用 现在python也较多地用于有大量的计算需求的任务 本文介绍几个并行模块 以及实现程序并行的入门技术 本文比较枯燥 主要是为后面上工
  • 2023版最新最全React面试题

    React 作为前端使用最多的框架 必然是面试的重点 我们接下来主要从 React 的使用方式 源码层面和周边生态 如 redux react router 等 等几个方便来进行总结 1 使用方式上 这里主要考察的是 在开发使用过程中 对
  • 均匀分布的期望和方差的推导_概率论中均匀分布的数学期望和方差该怎么求啊?...

    展开全部 数学期望是分布区间e68a8462616964757a686964616f31333431343065左右两端和的平均值 方差为分布区间左右两端差值平方的十二分之一 均匀分布是经常遇到的一种分布 其主要特点是 测量值在某一范围中各
  • Ubuntu下安装Matlab步骤

    1 下载matlab iso镜像文件 可以从verycd上下载 搜索matlab unix版可得到 我下的是2010a 2 打开终端 输入sudo mkdir mnt temp 建立临时文件夹存放装载后的iso文件 再输入 sudo mou
  • Come on和我一起做基于深度学习的缺陷检测一(数据准备)

    基于深度学习的织物疵点检测 数据集的制作 数据标注 数据增强 图像和xml文件同时增强 这里有几句话要说 这个项目会持续更新 由于要忙于毕业答辩和论文修改 更新时间不定 由于本人研三 今年毕业要去工作 可能会出现拖更的现象 我把以前Pyth
  • Java从入门到实战总结-3.3、Java的IO处理

    Java从入门到实战总结 3 3 Java的IO处理 文章目录 Java从入门到实战总结 3 3 Java的IO处理 1 java io File 1 类的声明 2 字段 3 类的构造函数 4 类方法 5 示例 2 文件遍历 3 文件过滤器
  • ckplayer 播放视频

    备注 其中引用文件无法上传 如果需要私信即可
  • “GPT+健康医疗”赋能医疗行业“数智化”发展,景联文科技提供高质量医疗数据库

    近日 ChatGPT这个代表着通用版的大型语言模型以其出色的表现在全球互联网上引人注目 它所使用的GPT技术基础为人工智能应用开启了全新的世界 大模型时代已经到来 它已变成基础设施 变成算力 变成生产力 大模型可能有通用技术 但更重要的是如
  • 实体识别和关系抽取的联合模型总结

    实体识别和关系抽取的目标是从非结构化的文本中发现 实体1 关系 实体2 的三元组 它对知识库的构建和问答任务都很重要 是信息抽取的核心问题 现有的关系抽取方法主要有两种 1 使用流水线方法进行抽取 先对句子进行实体识别 然后对识别出的实体两
  • UE常用使用技巧

    UE使用技巧1 如何在行末添加指定字符如 方法 ctrl r 用 p全部替换 n即可 p n 2 如何删除空行 查找 p 替换为空即可 p 空 3 括号自动匹配 Ctrl b4 加书签 Ctrl F2 加书签 Alt F2 在多个书签中进行
  • 调试最长的一帧(第十天)

    依照惯例 先看总体流程 到了更新回调 一边抄一边记忆 OSG更新回调的作用与事件回调有类似之处 由专门的访问器对象 updateVisitor负责场景图形更新遍历 所有的节点和Drawable几何体对象都可以使用setUpdateCallb
  • 数据结构——【堆】

    一 堆的相关概念 1 1 堆的概念 1 堆在逻辑上是一颗完全二叉树 类似于一颗满二叉树只缺了右下角 2 堆的实现利用的是数组 我们通常会利用动态数组来存放元素 这样可以快速拓容也不会很浪费空间 我们是将这颗完全二叉树用层序遍历的方式储存在数
  • 小程序登录授权分析

    登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识 快速建立小程序内的用户体系 在小程序 微信生态体系中 每个用户会有唯一标识的OpenID和UnionID 使用他们可以帮助开发者优化自己的注册和登录逻辑 毕竟 在中
  • the application was unable to start correctly(0x000007b)解决方案

    什麼是錯誤代碼0xc000007b 如果您在Windows 10 8 7中看到 應用程式無法正確啟動 0xc000007b 錯誤 那麼您來對地方了 0xc000007b應用程式錯誤非常常見 與錯誤代碼0x80070002 0x8007005
  • SSL的“四次握手”

    第一次握手 客户端向服务端发送Client Hello报文 该报文中包含了支持的版本信息 加密组件等 加密组建包括加密算法 秘钥长度等内容 第二次握手 这个阶段服务器会向客户端发送三个报文 服务端收到请求后 如果支持SSL通信 会首先以Se
  • SQL Server数据备份

    SQL Server数据库 自动 手动 备份 sql 数据库自动备份 一 为备份文件建一个独立文件夹 sql data autobakup 方便区分 Win R 输入services msc进入服务管理界面查找sqlserver服务 复制此
  • pulseaudio使用过程中遇到的问题

    W pulseaudio main c This program is not intended to be run as root unless system is specified E pulseaudio core util c H
  • Self-study Python Fish-C Note-5 P20-P26 (part2)

    python 中的列表 Part 2 本文主要讲解了python中列表的使用 本文为自学B站上鱼C的python课程随手做的笔记 如有问题 欢迎大家批评指正 原视频链接 https www bilibili com video BV1c44