文档章节

python学习10.04:Python list列表使用技巧及注意事项

太空堡垒185
 太空堡垒185
发布于 10/15 14:27
字数 1413
阅读 15
收藏 0

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remove()、pop() 和 del 关键字。

本节将通过实例演示的方式来明确各个函数的用法,以及某些函数之间的区别和在使用时的一些注意事项。

Python list添加元素的方法及区别

定义两个列表(分别是 list1 和 list3),并分别使用 +、extend()、append() 对这两个 list 进行操作,其操作的结果赋值给 l2。实例代码如下:

tt = 'hello'
# 定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
print(list1,id(list1))

print("1.----------------")

# 比较 list 中添加元素的几种方法的用法和区别
list3 = [6,7]
l2 = list1 + list3
print(l2,id(l2))

print("2.----------------")

# 效果等同于‘+’
l2 = list1.extend(list3)
print(l2,id(l2))
print(list1,id(list1))

print("3.----------------")

l2 = list1.append(list3)
print(l2,id(l2))
print(list1,id(list1))

输出结果为:

[1, 4, 'hello', 3.4, 'yes', [1, 2]] 2251638471496
1.----------------
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251645237064
2.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251638471496
3.----------------
None 1792287952
[1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7, [6, 7]] 2251638471496

根据输出结果,可以分析出以下几个结论:

  1. 使用“+”号连接的列表,是将 list3 中的元素放在 list 的后面得到的 l2。并且 l2 的内存地址值与 list1 并不一样,这表明 l2 是一个重新生成的列表。
  2. 使用 extend 处理后得到的 l2 是 none。表明 extend 没有返回值,并不能使用链式表达式。即 extend 千万不能放在等式的右侧,这是编程时常犯的错误,一定要引起注意。
  3. extend 处理之后, list1 的内容与使用“+”号生成的 l2 是一样的。但 list1 的地址在操作前后并没有变化,这表明 extend 的处理仅仅是改变了 list1,而没有重新创建一个 list。从这个角度来看,extend 的效率要高于“+”号。
  4. 从 append 的结果可以看出,append 的作用是将 list3 整体当成一个元素追加到 list1 后面,这与 extend 和“+”号的功能完全不同,这一点也需要注意。

Python list删除操作

接下来演示有关 del 的基本用法,实例代码如下:

tt = 'hello'
# 定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
print(list1)
del list1[2:5]
print(list1)
del list1[2]
print(list1)

输出结果为:

[1, 4, 'hello', 3.4, 'yes', [1, 2]]
[1, 4, [1, 2]]
[1, 4]

这 3 行输出分别是 list1 的原始内容、删除一部分切片内容、删除指定索引内容。可以看到,del 关键字按照指定的位置删掉了指定的内容。

需要注意的是,在使用 del 关键字时,一定要搞清楚,删除的到底是变量还是数据。例如,下面代码演示和删除变量的方法:

tt = 'hello'
# 定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
print(id(l2),id(list1))
del list1
print(l2)
print(list1)

运行结果如下:

1765451922248 1765451922248
[1, 4, 'hello', 3.4, 'yes', [1, 2]]
Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\demo.py", line 8, in <module>
    print(list1)
NameError: name 'list1' is not defined

第一行输出的内容是 l2 和 list1 的地址,可以看到它们是相同的,说明 l2 和 list1 之间的赋值仅仅是传递内存地址。接下来将 list1 删掉,并打印 l2,可以看到,l2 所指向的内存数据还是存在的,这表明 del 删除 list1 时仅仅是销毁了变量 list1,并没有删除指定的数据

除了删除变量,其他的删除都是删除数据,比如将列表中数据全部清空,实现代码如下:

tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
l3 = l2
del l2[:]
print(l2)
print(l3)

输出结果为:

[]
[]

可以看到,l3 和 l2 执行同样的内存地址,当 l2 被清空之后,l3 的内容也被清空了。这表明内存中的数据真正改变了。

另外,在实际过程中,即便使用 del 关键字删除了指定变量,且该变量所占用的内存再没有其他变量使用,此内存空间也不会真正地被系统回收并进行二次使用,它只是会被标记为无效内存

如果想让系统回收这些可用的内存,需要借助 gc 库中的 collect() 函数。例如:

# 引入gc库
import gc
tt = 'hello'
# 定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
del list1
# 回收内存地址
gc.collect()

前面我们在《Python缓存机制》一节讲过,系统为了提升性能,会将一部分变量驻留在内存中。这个机制对于,多线程并发时程序产生大量占用内存的变量无法得到释放,或者某些不再需要使用的全局变量占用着大的内存,导致后续运行中出现内存不足的情况,此时就可以使用 del 关键字来回收内存,使系统的性能得以提升。同时,它可以为团队省去扩充大量内存的成本。

本文转载自:http://c.biancheng.net/view/5765.html

太空堡垒185
粉丝 9
博文 184
码字总数 48619
作品 0
西安
系统管理员
私信 提问
Python教程:17个冷门但实用的小技巧

编者按:Python是机器学习的主流语言,没有之一。今年5月,它首次在PYPL排行榜上超越JAVA,成为全球第一大编程语言。而一个月后,Stack Overflow也分享了最新的编程语言浏览量统计数字,结果...

Python程序猿
2018/08/16
0
0
Python 编码时应该注意的几件事情

在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。 对于Python程序员,你需要注意一下本文所提到的这些事情。 你也可以看看Zen of Python(Pytho...

justjavac
2012/11/19
110
0
Python 编码时应该注意的几件事情

在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。 对于Python程序员,你需要注意一下本文所提到的这些事情。 你也可以看看Zen of Python(Pytho...

justjavac
2012/07/27
228
2
Python中实用却不常见的小技巧

这是一个老外总结的Python的小技巧: 文章首发于我的技术博客:你可以在上面看到更多的Python教程和python爬虫 “Talk is cheap show me the code”,这是编程人条,说半天不如几行代码更有说...

呆木木人儿
03/07
50
0
【收藏】Python实用技巧-成为Pythoner必经之路

前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好? 如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单、优雅; 如果你象我这样,对 Python 有兴...

燕莳泗
2013/03/24
408
0

没有更多内容

加载失败,请刷新页面

加载更多

交换两数(函数)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void Exchange(int* x, int* y){ int tmp = 0; tmp = *x; *x = *y; *y = tmp; } int main(){ int a; int b; scanf......

Lxxxxx256
35分钟前
3
0
给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践

作者 | 孙健波(天元) 阿里巴巴技术专家 本文整理自 11 月 21 日社群分享,每月 2 场高质量分享,点击加入社群。 早在 2011 年,阿里巴巴内部便开始了应用容器化,当时最开始是基于 LXC 技术...

阿里巴巴云原生
今天
6
0
数据平面

3.1数据平面的任务 解析数据包头 转发数据包到某些端口 通过查询由控制平面所生成的转发表 传统网络数据平面 数据包--输入端口---拆封和解析,转发策略匹配,转发调度---输出端口(协议相关,...

Firefly-
昨天
6
0
如何高效的阅读uni-app框架?(建议收藏)

作者 | Jeskson 来源 | 达达前端小酒馆 uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js。脚本,应用程序,main.js。日志打印,定时器,生命周期,页面,页面通...

达达前端小酒馆
昨天
8
0
实现原理专题--存储器的实现(三)

计算机实现原理专题--存储器的实现(二)中描述了一种电平触发器,但是某些应用需要在保持位从0到1变化的过程中对数据端进行保存。这种触发器叫边沿触发器。 一开始Q为0,时钟信号为0。当数据...

FAT_mt
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部