列表类型
1、用途
按照位置存多个值
2、定义方式
在[]内用逗号分隔开多个任意类型的值
l = [111, 3.1, "abc", []] # l=list(...)
print(type(l))
类型转换
list(传入的可以是任意能够被for循环遍历的类型)
print(list("hello"))
print(list(["a",'b']))
print(list({"k1":11,'K2':222}))
3、常用操作及内置方法的使用
1.通过列表索引正向取值或是反向取值
列表类型可以通过索引去取值或是改值,但是不能取加值
lis=[111,222,'arther',[222,333]]
lis[2]='egon'
print(lis[1])
lis[4]='aaaa' 报错
dic={'k1':111,'k2':222,'k3':333}
print(dic['k1'])
dic['k1']=555
dic['k4']=444
print(dic)
在字典中可以取加值
2.顾头不顾尾,步长
lis=[11,222,333,444,[111,222]]
print(lis[:-1])
#所有的切片操作不管对象是可变或是不可变,都是拷贝一份再进行操作
print(lis)
lis2=lis[:]
#======浅拷贝=======
#示范一
lis[0]=666
print(lis)
print(lis2)#不受影响
#示范二
lis[-1][0]=333
print(lis)
print(lis2) #受到了影响
l2=lis.copy()
浅拷贝是在新列表中复制了目标列表内所有值的内存地址,并且脱离了目标列表,所以当目标列表内存地址的值发生改变时,
新列表没有随之改变,如果目标列表内有子列表之类的可变类型的内存地址,在子列表内进行添加或删除的操作,
那其目标列表类的子列表内存地址没有发生改变,只是子列表的子内存地址发生改变。由于目标地址的子列表内存地址
直接对应新列表的子列表内存地址,那目标列表中子列表的改变也将发生在新列表内。
深拷贝
from copy import deepcopy
lis=[11,222,333,444,[111,222]]
l2=deepcopy(lis)
lis[4][1]=555
print(lis)
print(l2)
深拷贝相当于在把新列表中可变类型对应的内存地址改成一个没有与被拷贝列表可变类型内存地址相关联的新列表内存地址,
然后在把原列表的可变类型装的值放入新列表内存地址,这样当原列表不论发生任何变化,新列表都不会有任何关联且被改变。
总结:浅拷贝适合只读的操作,深拷贝适合可读、可写的操作。
3.长度
lis = [111, 222, 333]
lis_len = len(lis)
print(lis_len)
5.追加
lis=[11,222,333,444,[111,222]]
lis.append(222)
print(lis) #就只能在列表最后的位置添加
res=lis.insert(0,555) #在指定索引的前面添加
print(lis)
print(res) #返回为None,并没有拷贝进行操作
6.删除
lis=[11,222,333,444,[111,222]]
del lis[0] #万能删除法
lis.remove([111,222]) #指定删除,没有返回值
print(lis)
res=lis.pop(0)
print(lis)
print(res) #可以拿到返回值
需要掌握的内置操作
1.extend
l1=[444,555,666,777]
lis=[11,222,333,444,[111,222]]
lis.extend(l1) #将l1内的值打散按索引并依次加入到lis中
lis.extend('hello')
print(lis)
2.count
l1=[111,222,333,333,3334,444]
res=l1.count(333)
print(res) #数有多少
3.sort
lis=[11,222,333,444,[111,222]]
print(lis.sort()) #有子列表报错
print(lis[-1].sort()) #报空
print(lis) #报错
从小到大排列 要切括号内必须是纯数字
lis = [-15, -2222, 5555, 333, 111]
lis.sort(reverse=True) #反转
print(lis)
print(lis.reverse()) #None
4.index查询值对应的索引位置,自由设定查询区间
print(lis.index(333))
#没有则报错
类型总结
存多个值
有序
可变类型