1、列表的存储
列表是序列数组,可存储任意的数据类型对象,以下是列表的存储形式
列表中元素地址是连续空间存储的,元素地址是任意的。
举例:
#列表可存储不同类型的数据对象
l1=[123,"字符串",True]
print(l1,type(l1))
#列表的简单赋值
a,b=[123,"字符串"]
print(a,b)
a,*b=[123,2,4,6]
print(a,b)
2、列表的序列化操作
列表是一种序列,因此可以使用索引取值、切片操作、in操作、加衔接等
1)取值
#赋值
l2=[1,2,3,4,5]
#取值2
print(l2[1])
print(l2[-4])
#切片
print(l2[1:2])
print(l2[-1:-2:-1])# 反向取值
2)in操作判断是否存在
#赋值
l3=[3,4,5,6]
#判断3是否在列表中
print(3 in l3)#True
3)➕衔接
#叠加,返回结果[1, 2, 3, 4, 5, 6]
l4=[1,2,3]
l5=[4,5,6]
print(l4+l5)
3、循环列表
结构:for 变量 in 字符串/元组/列表/字典:
l1=[1,2,3,4,5]
for i in l1:
print(i)
"""
执行结果:
1
2
3
4
5
"""
#列表的range方法
for i in range(10):
print(i)
"""
执行结果:
0
1
2
3
4
5
6
7
8
9
"""
#range还可以像切片一样取值
for i in range(1,10):
print(i)
"""
执行结果:
1
2
3
4
5
6
7
8
9
"""
4、列表的增删改查(内置函数)3+3
1)增:append、 insert 、extend
#案例1追加数据
ll=[1,2,3]
ll1=[4,5,6]
ll.append(ll1)
print(ll)
"""
执行结果:
[1, 2, 3, [4, 5, 6]]
"""
#案例2 插入数据:一般不建议使用,牺牲效率;下标超出自动在最后插入
ll2=[1,2,3]
ll2.insert(2,4)#在下标为2的列表中插入4
print(ll2)
"""
执行结果:
[1, 2, 4, 3]
"""
#案例3向列表合并一个列表
ll3=[1,2,3]
ll4=[2,3,4]
ll3.extend(ll4)
print(ll3)
"""
执行结果:
[1, 2, 3, 2, 3, 4]
"""
2)删除操作:pop、remove、clear
#案例1 默认移除最后一个元素,否则按照索引值去删除对应的元素
ll1=[11,22,33,44]
ll1.pop(2)
print(ll1)
#案例2移除相应的元素
ll2=[1,2,3,4,3]
ll2.remove(3)#从列表中直接移除元素3(从左向右的第一个元素)
print(ll2)
#案例3清除列表
ll3=[1,2,3,4]
ll3.clear()
print(ll3)
"""
执行结果:
[11, 22, 44]
[1, 2, 4, 3]
[]
"""
3)修改操作
#修改
ll1=[1,2,3,4]
ll1[2]=33
print(ll1)
"""
执行结果:
[1, 2, 33, 4]
"""
#计数 列表中33有2个
ll2=[11,22,33,44,33,44,55]
num=ll2.count(33)
print(num)
4)查询列表
#查询 通过数据查询索引,没有即报错
ll1=[11,22,33,44,33]
print(ll1.index(22))#1
#列表的颠倒和排序
ll2=[2,4,1,3,5]
ll2.sort()
print(ll2)
"""
执行结果:
[1, 2, 3, 4, 5]
"""
#列表的颠倒和排序
ll3=[2,4,1,3,5]
ll3.sort(reverse=True)#等价于ll3.reverse()
print(ll3)
"""
执行结果:
[5, 4, 3, 2, 1]
"""
5、可变和不可变数据类型
python有两种数据类型:可变数据类型和不可变数据类型
可变数据类型:在id(内存地址)不变的情况下,value值可变,则称为可变类型(列表、字典)
不可变数据类型:在value值改变,id(内存地址)也改变,则称为不可变类型(整型、浮点型、字符串、布尔值、元组)
#不可变数据类型(值改变,地址也改变)
s="old"
print(s,id(s))
s="new"
print(s,id(s))
"""
执行结果:
old 140408410005616
new 140408410005552
"""
#可变数据类型(值改变,地址不变)
l1=[1,2,3]
print(l1,id(l1))
l1[0]=111
print(l1,id(l1))
"""
执行结果:
[1, 2, 3] 140230216119936
[111, 2, 3] 140230216119936
"""
6、深浅拷贝
#赋值
l1=[1,2,3]
l2=l1#赋值不属于拷贝
print(id(l1))
print(id(l2))
l1[0]=1111
print(l2)
"""
执行结果:
140433023079104
140433023079104
[1111, 2, 3]
"""
#浅拷贝(切片和copy都属于浅拷贝)
l3=[2,5,4]
l4=l3.copy()
print(id(l3),id(l4))
"""
执行结果:
140704407242752 140704375816000
"""
#深拷贝
import copy
l5=[1,2,3,[4,5,6]]
l6=copy.deepcopy(l5)
print(l5,id(l5))
print(l6,id(l6))
"""
执行结果:
[1, 2, 3, [4, 5, 6]] 140468406501952
[1, 2, 3, [4, 5, 6]] 140468427309952
"""
7、列表生成式
列表生成式是非常强大的,可以直接生成出一个新的列表
#列表生成式(可以不带if语句)
l1_new=[i*i for i in range(10) if i%2==0]
print(l1_new)
"""
执行结果:
[0, 4, 16, 36, 64]
"""
#列表生成式可以嵌套多个循环
l2_old=[[1,2],[3,4],[5,6]]
l2_new=[j for i in l2_old for j in i]
print(l2_new)
"""
执行结果:
[1, 2, 3, 4, 5, 6]
"""