Python 学习 (基础)

2024/09/04 posted in  Python
Tags: 

本文记录 Python 学习要点

列表和元组

列表 元组
动态 静态
可变 固定
较大 轻量
  • 异同点

列表和元组都是可以存放任意数据类型的有序集合,并且都支持负数索引和切片操作,不同的是列表为动态可变,元组为静态不可变。
共同拥有的函数有count(), index(), reversed(), sorted()等,值得注意的是reverse()sort()只支持数组,不支持元组,因为两方法都涉及修改原数组,而元组不可被改变。

  • 存储方式差别

元组本质上是 C 语言中的 array。当初始化一个元组,解释器向操作系统申请一定的内存,操作系统为元组对象分配所需要的内存,分配后该元组的内存大小固定不变。

当初始化一个列表,解释器会向操作系统申请多一些内存,比如初始化一个拥有两个元素的数组,解释器会向操作系统申请长度为 4 的数组的内存。这样避免了每次列表新增元素时都向操作系统请求分配内存,可提高效率。当列表为满时,列表才会再次向操作系统申请一定数量的内存。列表本质上也一样是 C 语言中的 Array,但因为列表会过量分配内存,所以是 over-allocated array。

可通过以下函数查询数组或元组的内存占用大小。

l = [1,2,3]
l.__sizeof__()

# 64
  • 性能差别

长度较小的元组若不再被引用,GC 机制不会将该部分内存回收,当再次创建同样大小的元组时,新元组会覆盖掉旧元组,不必重新寻找内存。

列表需要支持增删改操作,所以列表中除了存放元素,还会存放指针以完成修改操作。而元组则不需要存放额外的指针。

故元组的性能优于列表。

  • 列表初始化

list()[] 都可创建列表。list()是构造器,[]直接调用底层 C 代码。

[]性能优于list()

  • 应用场景

若需要对存放数据进行增删改操作,则选择列表。若存放的是静态的数据如经纬坐标等数据,则优先采用性能较优的元组。若对性能要求不高,也可以全部使用列表。

粤ICP备19162056号