一 、list 基础概念
python内置了一种数据类型是列表:list 。list 是一种有序的集合,可以随时添加和删除其中的元素。有点类似于我们C语言中的数组,但是数组只可以存放同一类型的数据,尔列表list可以存放任意数据类型的元素,他是一种或多种的数据元素的集合。
比如我们可以将一个班级的学生放入一个list中
在这里 class_name 就是一个list类型的数据
我们再看一下他的长度
我们可以对list数据类型的变量使用索引来访问其中每一个元素。索引从的范围0~len(list)
我们对list的最后一个元素,可以通过计算索引值,也可以通过list[-1]的方式获得
二、list 的长度
list因为可以存放任何数据类型的数据,因此我们list的长度小于等于列表的中所有元素个数,比如我们的嵌套列表,或我们的列表中嵌套一个tuple(后面会有介绍)。
访问第二层列表我们也可以使用索引的方式(有点像C语言中的二维数组)
三 、list的添加元素
1、append()f方法函数
append() 方法用于在列表末尾添加新的对象。
list.append(obj) #obj -- 添加到列表末尾的对象,该方法无返回值,但是会修改原来的列表
2、extend()方法函数
extend() 函数用于在列表末尾一次追加另一个序列中的多个值(用于新列表的扩张)list.extend(seq) #seq -- 元素列表 该方法没有返回值,但是会在已经存在的列表中添加新内容
3、insert()方法函数
insert()方法函数用于将指定对象插入列表的指定位置。
list.insert(index,obj) #index -- 对象要插入的索引的位置 obj -- 要插入列表中的对象 该方法没有返回值
4、append()与extend()方法函数差别
当我们使用append(list) 加入到一个列表的后面的时候,新列表的长度只是在原列表的长度上+1,
而extend(list)的时候,新列表的长度=原列表长度+len(list)。
因此append()只是在无论什么时候都只是添加一个参数在原列表的后面
四 、list删除元素
1、remove()方法函数
remove() 函数用于移除列表中某个值的 第一个匹配项 list.remove(obj) #obj -- 要移除的对象 可以是列表中存在的任意类型 该方法没有返回值
注意:list.remove()中的参数不是索引值,而是具体的元素值
list.remove()中的参数不是列表中的元素值的时候,会异常。
2、pop()方法函数
pop()方法用于移除列表中的一个元素(默认是最后一个元素),返回该元素的值(当无参数时是典型的栈特征)list.pop(index=-1) #index 需要被移除元素的索引,默认值为-1
默认参数
list.pop() <==> list.pop(-1)
移除索引为1的元素
3、del()方法函数
del() 从内从中释放某个元素.
del(obj) #可以是列表中的任何存在的元素,甚至是列表本身
五 、list的操作符
1、成员关系操作 in 、 not in
我们可以使用 in 或 not in来判断一个元素否存在列表中,使用in的时候,如果不存在,则返回False,反之返回True,使用 not in 时候,如果不存在,则返回True,反之返回False
2、大于 小于 等于 操作符
通过上面四个例子,我们可以看出,当两个列表判断大小时候,主要是看列表的第一个元素,因此列表的第一个元素必须是同种类型的数据(都是实型,或者都不是实型)
3 、‘+’ 操作符
列表可以在某些时候使用操作符 ‘+’进行列表的连接与扩展。
注意使用 + 操作符不会改变原列表而是返回一个新的列表
4、‘*’ 操作符
注意使用 * 操作符不会改变原列表而是返回一个新的列表
六 、list的拷贝
我们在判断两个变量是不是指向同一块内存我们可以使用下面几种方法进行判断方法一: 使用内置函数id()
我们使用 id 这个函数来查看变量在内从中的指向位置,如果两个变量的指向相同则证明连个变量使用同
一块内存区域:
方法二:使用 is 判断
“is ”表示的是对象标识符,表示两个变量的值是否在同一块内存空间
在这里我们要注意的是is和==是有区别的,“==”只会判断两个变量的值是否相等,不会去看变量指
向的内存是否相等,而,“is” 会对两者都进行判断。
因为python的内存模型的原因我们进行下面拷贝时就会发生问题
当我们使用等号将list_tmp复制给了list_1 的时候,我们对list_tmp进行修改,我们发现list_1也会被修改,这是因为python的内存模型
复制后:
当我们这样复制后,list_1并没有为list_1分配新的指向内存,而是和list_tmp共指向同一个内存块,因此当我们修改list_tmp的时候,list_1也会被修改.
因此我们在list拷贝时经常使用切片的方式去拷贝
这样list_1就会在复制后指向新开辟的内存块里。
但是我们使用切片对列表进行拷贝时,只有当列表中的元素都是简单数据类型时,可以完成深拷贝,但是当列表中的元素存在元组,列表等等数据结构时,我们的切片此时也只能进行浅拷贝,如果我们需要进行深拷贝,我们需要引入import copy 模块。
如上 我们发现 list1在进行切片跑别之后 ,list1和list2是不同的,但是因为list1[3]是一个列表,对于list1[3]
只进行了简单的“=”操作(指向复制),并没有对内存进行复制。
这里我们使用了深拷贝函数,这样无论我们的列表张存放任何数据类型的元素,我们都可以对内存进行拷贝,而不仅仅是拷贝了变量的指向。