python笔记1-准确掌握列表和元组

774 阅读2分钟

列表和元组,都是一个可以放置任意数据类型的有序(可用索引查询)集合

共同特点(相对其他语言):

  • 可以放不同类型的数据
list = [{"name":"gp","age":18},1,"nihao"]
  • 支持切片和负索引
list[-1]
tuple[:]
  • 相互转换
list(tuple)
tuple(list)

使用区别:

  • 列表是动态的(mutable),长度大小不固定,可以:增、删、改
  • 元祖是静态的(immutable),长度大小固定,不可以:增、删、改
list = [1,2,3]
list[0]=10
print(list)
# [10, 2, 3]

tuple = ([2,4,6],2,"ni")
tuple[0].append(1)
print(tuple)
# ([2, 4, 6, 1], 2, 'ni')

tuple[0]=["1",3,5]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-a4d7b2650c1a> in <module>()
      7 print(tuple)
      8 
----> 9 tuple[0]=["1",3,5]

TypeError: 'tuple' object does not support item assignment

** 储存方式和性能差别

  • 列表除了存储的数据之外,还需要额外的信息,比如指针,长度大小,因此占用空间大一些。
  • 列表长度可变,每次增加或删减操作时,分配空间时都会额外多分配一些

所以,元组的性能更优,更轻量,尤其体现在初始化上,在根据索引查找时,性能相差不大。

python -m timeit 'x = (1,2,3,4,5,6)' # 10000000 loops, best of 3: 0.0722 usec per loop
python -m timeit 'x = [1,2,3,4,5,6]' # 1000000 loops, best of 3: 0.238 usec per loop

总之:列表占用空间更大,性能更低,但储存内容可变;元组占用空间更小,性能更高,但储存内容不可变。

底层数据结构

计算机最基本的数据结构是数组和链表。数组适合快速、随机访问,不过数组插入和删除元素比较低效。链表插入和删除比较快,但不适合随机访问。那么python的列表和元组底层使用的是哪种数据结构呢?

  • 列表 答案:数组。列表底层是一个over-allocate的array,
    实际情况,为了优化储存结构,避免每次append都重新分配内存,列表预分配的空间allocate会大于使用空间。
  • 元组 答案:也是数组。
    不同的是,数组的空间是固定的。并且python对元组的效率做了很大优化:当tuple<20,python会将其缓存,如果创建相同的tuple,python会直接从缓存载入。

使用场景

不可变的信息,比如地点的经纬度,使用元组
经常变化的信息,使用列表