一、列表的创建
1.创建一维列表
# 创建列表方式一:使用[]
lst = ['hello', 'world', 98, 'hello']
# 创建列表方式二:使用内置函数list()
# lst2 = list(['hello', 'world', 98])
print(id(lst))
print(type(lst))
print(lst)
# 方式三:利用`range()`函数创建列表,生成有规律的列表
#【例子】
x = list(range(10)) # 设置start、stop、和step
print(x, type(x))
lst = list(range(1, 10))
print(lst)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
x = list(range(1, 11, 2))
print(x, type(x))
# [1, 3, 5, 7, 9] <class 'list'>
x = list(range(10, 1, -2))
print(x, type(x))
# [10, 8, 6, 4, 2] <class 'list'>
# 方式四:列表生成式:生成有规律的列表
# 生成1,2,3,4,5,6,7,8,9
lst = [i for i in range(1, 10)]
print(lst)
# 等价于
lst = []
for i in range(1,10):
lst.append(i)
# 生成2,4,6,8,10
lst = [i*2 for i in range(1, 6)] # 注意范围左开右闭
print(lst)
lst = [i for i in range(2, 11, 2)] # 步长为2,可修改表达式即2*i for i in range(2,11)
print(lst)
# 生成4,9,16,25,36,49
lst = [i*i for i in range(2, 8)]
print(lst)
x = [0 for i in range(5)] # 表达式为常量
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>
# 带有条件判断
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x, type(x))
# [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99] <class 'list'>
# 方式五:*操作符
x = [0] * 5
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>
2.创建多维列表
# 定义一个存储信息的二维列表
# a = ['张海', 90, 80, 70] # 3门课程(语文,数学,英语)的成绩
# b = ['李晶晶', 98, 88, 77]
# c = ['黄晓洁', 99, 89, 77]
# score = [a, b, c]
# print(score)
score = [['张海', 90, 80, 70], ['李晶晶', 98, 88, 77], ['黄晓洁', 99, 89, 77]]
print(score)
print(score[0][2])
# 创建一个 4×3的二维数
# 列表生成式
x = [[0 for col in range(3)] for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
x = [[0] * 3 for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
# 乘法操作符
x = [[0] * 3] * 4 # [0]*3相当于[0 for i in range(3)];
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
注意: 由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的`[1,2,3]`,也有3个指针和3个整数对象。 `x = [a] * 4`操作中,只是创建4个指向list的引用,所以一旦`a`改变,`x`中4个`a`也会随之改变。
# 创建一个 4×3的二维数
x = [[0 for col in range(3)] for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
# 使用列表生成式,创建四个不同的对象
for i in x:
print(i, id(i), type(i))
结果如下: [0, 0, 0] 2170088154560 <class 'list'> [0, 0, 0] 2170088176256 <class 'list'> [0, 0, 0] 2170088175680 <class 'list'> [0, 0, 0] 2170088155776 <class 'list'> 当开始修改列表中的值时,列表中第一个子列表的第一个元素变化
x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
x = [[0] * 3] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>
# 使用*操作符,四个子列表都指向同一对象
for i in x:
print(i, id(i), type(i))
结果如下: [0, 0, 0] 2170088154560 <class 'list'> [0, 0, 0] 2170088154560 <class 'list'> [0, 0, 0] 2170088154560 <class 'list'> [0, 0, 0] 2170088154560 <class 'list'> 当修改列表中第一个子列表的第一个元素时,分析所有子列表的第一个元素都发生了变化
x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>
总结:
*操作符是复制了值的引用,而不是创建新的对象,在下述list里4个元素指向同一个对象的引用
对列表使用*操作符,很方便,但要注意:
对于不可变对象(int、字符串、元组)而言是复制值
对于可变对象(列表、字典)而言是复制引用
因此对于包含可变对象的列表切莫使用乘法,一旦修改里面的值都会改变,可使用列表生成式替代
二、列表的访问
lst = ['hello', 'world', 98, 'hello']
1.获取列表中指定元素的索引 index()方法
print(lst.index('hello')) # 如果列表中有相同元素只返回列表中相同元素的第一个元素的索引
# print(lst.index('Python')) # 如果查询的元素不在列表中,则会抛出ValueError
# print(lst.index('hello', 1, 3)) # 还可以在指定的start和stop之间进行查找
2.获取列表中单个元素 list.[index]
0 | 1 | 2 | 3 |
hello | world | 98 | hello |
-4 | -3 | -2 | -1 |
正向索引从0到N-1,如lst[0],N为元素的个数 负向索引从-N到-1,如lst[-N] 指定索引不存在,抛出IndexError
二维列表list[i][j]
3.获取列表中多个元素 切片--列表名[start:stop:step]
lst2 = [10, 20, 30, 40, 50, 60, 70, 80]
print('原列表', id(lst2))
lst3 = lst2[1:6:1] # start=1,stop=6,step=1
# lst4 = lst3[1:6] # 切片:左闭右开
# lst4 = lst3[1:6:]
print('切的片段', id(lst3)) # 切后的片段形成新的id,原列表切片的拷贝
print(lst2[1:6:1])
print(lst2[1:6:2])
print(lst2[::-1])