1.创建方式
[] 或 list()
a = [] # 表示一个空列表
a = [1, 2, 3, 4, 5]
a
[1, 2, 3, 4, 5]
list("hello world")
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
l = list("hello world")#l列表长度为11, 小标从0到10
l[1]
'e'
l[10]
'd'
l[-1] # 逆序取值 在数值前面加上负号,表示逆序取值
'd'
2.列表的切片功能
l[0:5] # 表示下标从0开始遍历到4, 左闭右开
['h', 'e', 'l', 'l', 'o']
l[开始:结尾:步长] # 步长可以省略,默认值为1
l[:5]#表示从最开始切片到4
['h', 'e', 'l', 'l', 'o']
l[5:] # 表示从5开始切片到最后
[' ', 'w', 'o', 'r', 'l', 'd']
l[:] #表示遍历所有
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
l[::2] # 步长为2,遍历
['h', 'l', 'o', 'w', 'r', 'd']
l[::-1] #步长为-1, 表示倒序遍历,实现列表的翻转
['d', 'l', 'r', 'o', 'w', ' ', 'o', 'l', 'l', 'e', 'h']
3.向列表中添加元素
# attend 表示在列表最后添加一个元素
number = [1, 2, 3, 4, 5]
number.append(6)
number
[1, 2, 3, 4, 5, 6]
# 使用extend()向列表末尾添加多个元素
number = [1, 2, 3, 4, 5, 6]
number.extend([7, 8])
number
[1, 2, 3, 4, 5, 6, 7, 8]
# 在列表的任意位置插入元素
number.insert(0, 0) #第一个参数表示列表中的位置,第二个参数表示要插入的值
number
[0, 0, 1, 2, 3, 4, 5, 6, 7, 8]
4.从列表中获取元素
# 交换位置
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name[0], name[3] = name[3], name[0]
name
['鸟蛋', '鸭蛋', '鹅蛋', '鸡蛋']
name[0]
'鸟蛋'
列表赋值的骚操作
L1 = [1, 2, 3]
a, b, c = L1
print(a, b, c)
1 2 3
5.从列表中删除元素
有三种方法:remove()、del、pop()
# .remove(x)函数,并不需要知到x在哪个位置,如果想要删除的东西没在列表中的话,就会报错
# remove()函数不能指定删除某个位置的值
name.remove("鹅蛋")
name
['鸟蛋', '鸭蛋', '鸡蛋']
# del函数
del name[0]
name
['鸭蛋', '鸡蛋']
# 删除整个列表,在del 后面加上列表名字即可
del name
# 再执行name语句便会报错
# .pop()默认弹出列表中最后一个数
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name.pop()
'鸟蛋'
# 也可以在pop()中加入索引值
name = ["鸡蛋", "鸭蛋", "鹅蛋", "鸟蛋"]
name.pop(2)
'鹅蛋'
name
['鸡蛋', '鸭蛋', '鸟蛋']
6.列表比较
# list比较大小是从第一个元素开始,一个一个进行比较,只要有了结果就会马上返回值
list1 = [123]
list2 = [456]
list1 > list2
False
list1 = [123, 789]
list2 = [456, 321]
list1 > list2
False
7.列表的 * + 运算
# 在列表中,我们可以通过+号,实现俩个列表的拼接
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2
list3
[1, 2, 3, 4, 5, 6]
#也可以使用extend()函数实现列表的拼接
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
list1
[1, 2, 3, 4, 5, 6]
# *(乘号)表示重复操作符,能使列表复制
list1 = [1, 2, 3]
list1 *= 3
list1
[1, 2, 3, 1, 2, 3, 1, 2, 3]
8.二维列表
# 如何访问二维列表中的数字
list1 = [1, 2, [3, 4, 5],6]
list1[2] # 也表示一个列表
[3, 4, 5]
# 因为list1[2]可以看做是一个列表,所以我们可以通过对list1[2]的下标进行访问
list1[2][0]
3
list1[2][1]
4
8.列表中的in 和 not in
list1 = [1, 2, 3, 4]
1 in list1
True
5 in list1
False
5 not in list1
True
# 对于二维数组,in 和 not in 只能判断一个层次的成员关系,如果想要判断二维数组中的元素
#是否存在,需要进入下一层次中进行访问
list1 = [1, 2, [3, 4], 5]
3 in list1
False
3 in list1[2]
True
9.列表中的几个函数
dir(list) # 查看列表有多少该可以使用的函数
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__delitem__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__gt__',
'__hash__',
'__iadd__',
'__imul__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__len__',
'__lt__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__reversed__',
'__rmul__',
'__setattr__',
'__setitem__',
'__sizeof__',
'__str__',
'__subclasshook__',
'append',
'clear',
'copy',
'count',
'extend',
'index',
'insert',
'pop',
'remove',
'reverse',
'sort']
# len()函数用来返回列表的长度
list1 = [1, 2, 3, 4, 5]
len(list1)
5
# count()用来计算一个数在列表中出现的次数
list1 = [1, 2, 1, 2, 1, 3, 4]
list1.count(1)
3
# index()函数会返回一个数在列表中的位置
list1.index(4)
6
list1.index(1)# 这里返回的是第一个1出现的位置
0
# 我们可以通过限制范围来查找下一个值
start = list1.index(1) + 1
end = len(list1)
list1.index(1, start, end)
2
# reserve()方法的作用是将整个列表翻转
list1 = [1, 2, 3, 4, 5, 6]
list1.reverse()
list1
[6, 5, 4, 3, 2, 1]
# sort() 对列表中的元素进行从小到大排序
list1.sort()
list1
[1, 2, 3, 4, 5, 6]
深拷贝与浅拷贝
a = [1, 2, 3]
b = a
a[0] = 5
a
[5, 2, 3]
b
[5, 2, 3]
我们发现当我们改变a的值时,b也会跟着改变,原因是,a与b指向了同一个内存单元,
当内存单元中的值发生改变时,所有指向这个内存单元的变量也会跟着改变
a = [1, 2, 3]
b = a[:]
a[0] = 5
a
[5, 2, 3]
b
[1, 2, 3]
当a将自己切片所获得的值给b时,由于b并没有和a指向同一片内存单元,只是a将自己内存单元的东西
复制给了b所在的内存单元,所以对a内存单元的值进行改变时,并不会改变b中值
# 浅拷贝(copy()),b不会应为a的改变而改变
a = [1, 2, 3]
b = a.copy()
c = list(a)# c 和 d得到的都是a的返回值,并没有指向a所在的地址,所以都属于浅拷贝
d = a[:]
a[0] = 5
a
[5, 2, 3]
b
[1, 2, 3]
c
[1, 2, 3]
d
[1, 2, 3]
a = [1, 2, [3, 4], 5]
b = a.copy()
a[1] = 6
a[2][0] = 7
a
[1, 6, [7, 4], 5]
b
[1, 2, [7, 4], 5]
我们发现通过改变a的值,b中一维数组中的数并没有发生改变,但二维数组中的数发生了改变
因为我们copy的时候,将二维数组的地址也进行了copy所以,a与b的二维数组是指向了同一个内存单元,当我们对a的二维数组中的值进行改变时,b中二维数组中的值也会随之改变
# 深拷贝(deepcopy()) 通过深拷贝,对a中二维数组中的值进行改变时,
# b中二维数组中值不会再发生变化
import copy
a = [1, 2, 3, [1, 2, 3]]
b = copy.deepcopy(a)
a[3][0] = 4
a
[1, 2, 3, [4, 2, 3]]
b
[1, 2, 3, [1, 2, 3]]
# copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象内部的子对象
import copy
a = [1, 2, 3, [1, 2, 3]]
b = copy.copy(a)
a[3][1] = 0
a[1] = 6
a
[1, 6, 3, [1, 0, 3]]
b
[1, 2, 3, [1, 0, 3]]