前言
今天开始来写Python基础方面(基础中附带进阶知识)的知识,虽说是基础,但是很多小伙伴可能也不能完全熟练掌握这些知识点。今天我们来讲的是python中的列表和元组。
列表和元组
不管我们学习什么语言都会有集合这个概念。列表和元组就是有序集合
。在集合里我们可以放置任意的数据类型,像一些字符串、整数、对象
等等。当然有一些语言里的集合需要同一类型才行,但是在Python中就没有这个限制。
1.初印象
说了这么多,大家可能还是不知道啥是列表,啥是元组,直接看我下面的例子:
>>> l = [1,2,'a','b'] >>> l [1, 2, 'a', 'b'] >>> tup = (1,2,'a','b') >>> tup (1, 2, 'a', 'b')
我们在编辑器中定义了一个列表l和一个元组tup,然后填入了相应的数据。相信大家看到这里就对元组和列表有个初印象了。
2.两者区别
相信大家内心有个疑问,都是能够放入不同类型的集合,那有啥区别
?
- 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素
- 元组是静态的,长度大小固定,无法增加删减或者改变
直接上例子给大家看看:
>>> l[1] = 100 >>> l [1, 100, 'a', 'b'] >>> tup[1] = 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment>>> l[1] = 100 >>> l [1, 100, 'a', 'b'] >>> tup[1] = 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
大家可以看到,我们将list中索引值为1的值改为100是成功的,但是去修改元组时就报错了。
但是,这里就引申了一个问题---如何修改元组的值
唯一的办法就是开辟一块新的内存空间,说简单点就是你需要重新创建一个元组,然后拼接上去。例如我想在tup上新增一个数字100:
>>> tup1 = tup+(100,) >>> tup1 (1, 2, 'a', 'b', 100)
看上去就比较难受,所以该用啥时就用啥,list它不香吗?
3.list和tuple的骚操作
其实这里讲的就是list和tuple里一些内置函数。我直接通过代码的形式来给大家讲解了。
3.1 负索引
>>> l [1, 100, 'a', 'b'] >>> tup (1, 2, 'a', 'b') >>> l[-1] 'b' >>> tup[-1] 'b'
大家可以看到列表和元组都支持负索引,简单点说就是一个倒着的索引,可以反向取值。
-1表示倒数第一个值,-2表示倒数第二个值....
3.2 切片操作
>>> l[1:3] [100, 'a'] >>> tup[1:3] (2, 'a')
大家看到上面的代码,可以发现我们可以获取列表或者元组中某个区间的值,这就是切片操作。
3.3 count()
>>> l = [1,2,3,3,3,4,4,4,4,12] >>> l.count(3) 3 >>> l.count(4) 4 >>> tup.count(1) 1
计算出list或者tuple中元素出现的次数
3.4 index()
>>> l = [1,2,3,3,3,4,4,4,4,12] >>> l.index(12) 9 >>> tup (1, 2, 'a', 'b') >>> tup.index(2) 1
返回某值得索引值
3.5 reverse()
>>> l [1, 2, 3, 3, 3, 4, 4, 4, 4, 12] >>> l.reverse() >>> l [12, 4, 4, 4, 4, 3, 3, 3, 2, 1]
将列表中的数据逆序排列。大家可能注意到元组是没有这个函数的,是因为元组不可以改变其内容。
但是也还是有办法将元组逆序,只不过需要转化为list。
3.6 sorted()
>>> l=[2,3,1,123,33,23] >>> sorted(l) [1, 2, 3, 23, 33, 123]
将列表安装顺序排序。
4.list和tuple的存储方式和性能
首先我们来看一段代码:
>>> l = [1,2] >>> tup=(1,2) >>> l.__sizeof__() 56 >>> tup.__sizeof__() 40
我们可以发现列表比元组大了16个字节,为什么呢?原因在于list是属于动态的,就类似链表,需要一个空间来存储指针
(学过C语言的朋友应该很熟悉),存储指针花了8个字节,另外8个字节是存储已经分配的长度大小
,因为列表属于可变的,我们需要随时知道它的空间大小情况。
>>> l = [] >>> l.__sizeof__() 40 # 第一次变化 >>> l.append(1) >>> l.__sizeof__() 72 >>> l.append(2) >>> l.__sizeof__() 72 >>> l.append(3) >>> l.__sizeof__() 72 >>> l.append(4) >>> l.__sizeof__() 72 # 第二次发生变化 >>> l.append(5) >>> l.__sizeof__() 104
重点:大家看到上面的代码可以发现,当我们给列表添加一个数据时,会为我们提供32个字节的存储空间,换算成int 8字节,也就是提供了4个int值得空间给我们,所以我们在添加4个数据之前,存储空间都是没有发生变化的,直到第五个值又给我们分配了32个字节。
关于它的存储我们就了解的差不多了,显而易见哪个的性能好。元组因为是不能够改变的,所以他所分配的存储空间也是固定的,所以元组的性能会比列表更好一筹。但是,这个得根据你实际开发情况而定。
结尾
本文到这里就结束了,如果大家希望能够继续看到更多有关于Python基础或者进阶的知识,可以疯狂的点在看
,这篇文章在看超20,马上更新下一篇!欢迎来白嫖!