元组和列表同属序列类型,且均可以按照特定顺序存放一组数据,数据类型不受限制,只要是 Python 支持的数据类型就能够。那么,元组和列表有哪些区别呢?python
元组和列表最大的区别就是,列表中的元素能够进行任意修改,就比如是用铅笔在纸上写的字,写错了还能够擦除重写;而元组中的元素没法修改,除非将元组总体替换掉,就比如是用圆珠笔写的字,写了就擦不掉了,除非换一张纸。缓存
须要注意的是,这样的差别势必会影响二者的存储方式,咱们来直接看下面的例子:函数
>>> listdemo = [] >>> listdemo.__sizeof__() 40 >>> tupleDemo = () >>> tupleDemo.__sizeof__() 24
能够看到,对于列表和元组来讲,虽然它们都是空的,但元组却比列表少占用 16 个字节,这是为何呢?oop
事实上,就是因为列表是动态的,它须要存储指针来指向对应的元素(占用 8 个字节)。另外,因为列表中元素可变,因此须要额外存储已经分配的长度大小(占用 8 个字节)。可是对于元组,状况就不一样了,元组长度大小固定,且存储元素不可变,因此存储空间也是固定的。性能
读者可能会问题,既然列表这么强大,还要元组这种序列类型干什么?spa
经过对比列表和元组存储方式的差别,咱们能够引伸出这样的结论,即元组要比列表更加轻量级,因此从整体上来讲,元组的性能速度要因为列表。操作系统
另外,Python 会在后台,对静态数据作一些资源缓存。一般来讲,由于垃圾回收机制的存在,若是一些变量不被使用了,Python 就会回收它们所占用的内存,返还给操做系统,以便其余变量或其余应用使用。指针
可是对于一些静态变量(好比元组),若是它不被使用而且占用空间不大时,Python 会暂时缓存这部份内存。这样的话,当下次再建立一样大小的元组时,Python 就能够不用再向操做系统发出请求去寻找内存,而是能够直接分配以前缓存的内存空间,这样就能大大加快程序的运行速度。code
下面的例子,是计算初始化一个相同元素的列表和元组分别所需的时间。咱们能够看到,元组的初始化速度要比列表快 5 倍。内存
C:\Users\mengma>python -m timeit 'x=(1,2,3,4,5,6)' 20000000 loops, best of 5: 9.97 nsec per loop C:\Users\mengma>python -m timeit 'x=[1,2,3,4,5,6]' 5000000 loops, best of 5: 50.1 nsec per loop
固然,若是你想要增长、删减或者改变元素,那么列表显然更优。由于对于元组来讲,必须得经过新建一个元组来完成。
总的来讲,元组确实没有列表那么多功能,可是元组依旧是很重要的序列类型之一,元组的不可替代性体如今如下这些场景中: