1. list和元组

1. list和元组_第1张图片
2cfc18adf51b61ca8140561071d20c1d.png

1. 列表和元组基础概念

  • 列表是动态的
    长度和list的内存大小是不变的;
  • 元组是静态的:
    长度和大小固定,无法进行增加和删除元素;
    元组进行增加或删除时,相当于需要创建新的元组;
tup = (1, 2, 3, 4)
new_tup = tup + (5, ) # 创建新的元组 new_tup,并依次填充原元组的值
# new _tup
# (1, 2, 3, 4, 5)

l = [1, 2, 3, 4]
l.append(5) # 添加元素 5 到原列表的末尾
# l
# [1, 2, 3, 4, 5]
  • 元组和list都支持负数索引
  • 元组和list支持切片操作想
# 注意:切片操作,[ ) :  =< ~ <
l = [1, 2, 3, 4]
l[1:3] # 返回列表中索引从 1 到 2 的子列表
# [2, 3]

tup = (1, 2, 3, 4)
tup[1:3] # 返回元组中索引从 1 到 2 的子元组
# (2, 3) 
  • 支持随意嵌套
  • 可通过list()和tuple()函数相互转换
  • 内置函数如下:
l = [3, 2, 3, 7, 8, 1]
l.count(3)  ###:计算某个item出现的次数
2
l.index(7)###: 返回item第一次出现的索引
3
### list.reverse/list.sort
l.reverse()
l
[1, 8, 7, 3, 2, 3]
l.sort()
l
[1, 2, 3, 3, 7, 8]

tup = (3, 2, 3, 7, 8, 1)
tup.count(3)
2
tup.index(7)
3
list(reversed(tup))
[1, 8, 7, 3, 2, 3]
sorted(tup)
[1, 2, 3, 3, 7, 8]

2. 列表和元组存储方式的差异

测试代码:

l = [1, 2, 3]
a=l.__sizeof__()
print (a) #32

tup = (1, 2, 3)
b=tup.__sizeof__()
print (b) #24
  • 列表由于是动态的,它需要额外8个字节:指针(指向对应的元素---4字节)、存储长度(4---字节)
  • 列表是动态的,为了减小每次增加或删除时空间的开销,python每次都会多分配一些;

3. 列表和元组的性能

  • 元组比列表更加轻量级;
  • 资源缓存:
    对于一些静态变量,如果它不被使用并且占用的空间不大时,python会暂时缓存这部分内存。

4. 创建一个列表的方式有两种:list()和[],这两种的效率有什么区别?

区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive;
反观[]是一个内置的C函数,可以直接被调用,因此效率高。
类似于,C语言中的内联函数于普通函数调用的区别,内联函数。

内联函数类似于宏,如果编译器将这个函数当做内联函数来处理(内联函数只是建议编译器这样处理而已,而非一定),那么这个函数的代码在调用的地方展开,像宏定义一样。
所谓的速度更快是它省去了调用函数的一些开销,比如建立新的栈帧等。虽然这样确实减少了一定的时间开销,但是会造成函数代码的体积增大

你可能感兴趣的:(1. list和元组)