Python列表内存浅析|周末学习

372 阅读3分钟

这是我参与更文挑战的第 5 天,活动详情查看: 更文挑战

「本文已参与 周末学习计划,点击查看详情 」

1.基本简述

1.1 序列

序列是Python中最基本的数据结构。序列是一种数据存储方式,用来存储一系列的数据。

在内存中,序列就是一块用来存放多个值的连续的内存空间。比如一个整数序列[10,20,30,40]

序列中的每个元素都分配一个数字 - 它的位置,或索引。第一个索引是0,第二个索引是1,依此类推。

1.2 列表

列表:用于存储任意数目、任意类型的数据集合。

列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:

a = [10,20,30,40]

其中,10,20,30,40 这些称为:列表a的元素。

列表中的元素可以各不相同,可以是任意类型。比如:a = [10,20,"abc",True,[]]

2.列表内存分布

2.1 创建列表
# 定义一个列表
a = [10,20,30,40]
# 打印列表a的地址以及其元素

print(id(a))  # 4376650528
print(id(a[0])) # 10--4527943632
print(id(a[1])) # 20--4527943952
print(id(a[2])) # 30--4527944272
print(id(a[3])) # 40--4527944592

截屏2021-06-05 21.06.52.png

2.2 列表添加元素
  • 使用append()或者extend()函数添加元素。在列表尾部进行添加元素

当列表增加元素时,列表会自动进行内存管理,减少了程序员的负担。但是列表元素大量移动,效率低所以一般建议在尾部添加。

# 定义一个列表
a = [10,20,30,40]

# 使用a.append()
a.append(50)

# 或者使用a.extend([50])
# a.extend([50])

print(a)   # [10,20,30,40,50]
print(id(a))  #4376650528

截屏2021-06-05 21.07.47.png 本地电脑运行结果:

列表是可变数据类型,地址不变,值可变。因此,添加新的值之后,地址也是不变的。

截屏2021-06-05 21.48.49.png

  • 使用insert()函数指定任意位置插入元素
# 定义一个列表
a = [10,20,30,40]

# 使用insert()函数
a.insert(2,50)

print(a) # [10,20,50,30,40]

print(id(a)) # 4376650528

解析:在索引2处要引用50这个元素

  1. python内存内部会对列表申请8个空间空间。
  2. 在8个内存空间里,遍历索引2,引用50这个对象
  3. 后续索引3和索引4各后退一步

申请了8个内存空间但是list实际用来存储元素只使用了其中5个内存空间 insert的时间复杂度是O(n)

WX20210605-233347@2x.png

2.3 列表删除元素
  • Pop()时间复杂度为O(1)

pop () 方法 删除并返回指定位置的元素,如果未指定位置则默认操作

# 定义一个列表
a = [10,20,30,40]

# 使用pop()函数 默认删除最后一个
a.pop()

WX20210605-235006@2x.png

pop () 方法 删除并返回指定位置的元素,如果未指定位置则默认操作

2.4 声明二维列表
# 定义一个列表
student = [            ["TOM",12],
            ["ANNE",11],
            ["Bob",8],
            ["Jon",9]
          ]

# 打印二维列表
print(student)

截屏2021-06-05 21.31.24.png

结果运行:

截屏2021-06-05 23.10.23.png