列表是Python中最基本的数据结构,用[]括起来。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
特点:有序 ,可重复,类型可变
Demo:
li=['r','o','b','o','t'] print(li.pop(1))#li.pop返回被丢弃的元素 print(li) print(li.remove('o'))#无返回值,移出第一次遇到的指定元素 print(li) del li[1] print(li) li.clear()#全部删除 print(li) '''输出为: o ['r', 'b', 'o', 't'] None ['r', 'b', 't'] ['r', 't'] []'''枚举遍历:
enumerate(),对于一个可迭代/可遍历的对象(列表,字符串)将其组成一个索引序列,利用它,我们可以同时获得索引和值
for i in enumerate(li,0): print(i) ''' (0, 'a') (1, 'b') (2, 'c') (3, 'e')'''拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。
浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层
三种实现:
-切片操作[:]
工厂函数list(li)
copy模块内的copy函数
la=[1,2,3,4,5,6,7,'s',['x','y']] lb=la lb2=la[:] print(id(la),id(lb2)) import copy lb_copy=copy.copy(la) print(id(la),id(lb_copy)) la.append('test') #添加一个原子类型,不会影响lb_copy和lb2 la[8][0]='xxxx#' print(la) print(lb_copy) print(id(['xxxx','y'])) print(id(la[8][0]),id(lb_copy[8][0])) ''' 42966344 42966408 42966344 43403080 [1, 2, 3, 4, 5, 6, 7, 's', ['xxxx#', 'y'], 'test'] [1, 2, 3, 4, 5, 6, 7, 's', ['xxxx#', 'y']] 43403272 42960072 42960072 #可以看到la和lb_copy中的列表地址是相同的 ''' 深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享) import copy la=[1,2,3,4,5,6,7,'s',['x','y']] lb_deepcopy=copy.deepcopy(la) la[5]='ssss' la[8][0]='sssssssss' print(la,id(la),id(la[8][0])) print(lb_deepcopy,id(lb_deepcopy),id(lb_deepcopy[8][0])) ''' [1, 2, 3, 4, 5, 'ssss', 7, 's', ['sssssssss', 'y']] 43337672 34805360 [1, 2, 3, 4, 5, 6, 7, 's', ['x', 'y']] 43338952 33844560''' #可以看到 la和lb_deepcopy中的列表地址也是完全不同的列表解析式:它可以根据已有列表,高效创建新列表的方式。列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,返回的是一个列表,因此用在[]中
实现原理:迭代[可迭代对象]中的每一个元素每迭代一次的结果赋值给对应的迭代元素,通过表达式运算,得到一个新的值最后将得到的所有值以一个列表的形式返回
#格式 [表达式 for 迭代元素 in 可迭代对象] #下面两个函数意思等同: li=[] for x in range(10): li.append(x) print(li) print([x for x in range(10) if x%2==0]) #带过滤功能格式:下面两个的意思也完全一样 [exp for iter_val in iter if if_contion] li=[] for lter_val in iter: if if_contion: li.append(lter_val)