1. 列表概述
列表(list)是最重要的Python内置对象之一,是包含若干元素的有序连续内存空间。当列表增加或删除元素时,列表对象自动进行内存的拓展或收缩,从而保证相邻元素之间没有缝隙。Python列表的这个内存自动管理功能可以大幅度减少程序员的负担,但插入和删除非尾部元素时涉及列表中大量元素的移动,会严重影响效率。另外,在非尾部位置插入和删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。所以,除非确实有必要,否则应尽量从列表尾部进行元素的追加与删除操作。
在形式上,列表的所有元素放在一对方括号[ ]中,相邻元素之间使用逗号分隔。同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、集合、函数以及其他任意对象。如果只有一对方括号而没有任何元素则表示空列表。
如下面几个都是合法的列表对象:
[10,20,30,40]
['crunchy frog','ram bladder','lark vomit']
['spam',2.0,5,[10,20]]
[{3},{5:9},(1,2,5)]
Python采用基于值的自动内存管理模式,变量并不直接存储值,而是存储值的引用或者内存地址,这也是Python中变量可以随时改变类型的重要原因。同理,Python列表中的元素也是值的引用,所以列表中各元素可以是不同类型的数据。
2.列表创建与删除
创建列表最直接的方法是在方括号中放置逗号分隔的字面量。如果方括号中为空,那么创建的就是一个空列表。
empty_lst=[]
lst=[2,3,5,7]
创建列表的第二种方法是使用函数list()。一方面,可以在调用函数的时候不提供任何参数,这时创建一个空列表。另一方面,也可以提供一个可迭代对象,比如 range对象、字符串对象、甚至一个列表,这时创建的列表中包含可迭代对象中的所有元素,并且这些元素的相对顺序也保持一致。
empty_lst=list()
print(empty_lst)
[]
a=list(range(5))
print(a)
[0,1,2,3,4]
b=list('cat')
print(b)
['c','a','t']
当一个列表不再使用时,可以使用del命令将其删除,这一点适用于所有类型的Python对象。
x=[1,2,3]
del x
print(x)
NameError: name 'x' is not defined
创建列表的第三种方法是使用列表推导,形如[expression for x in iterable], 其含义是依次将可迭代对象iterable 中的元素赋值给变量 x ,然后基于x的值求解表达式expression , 并将表达值 expression 的值放入新建的列表中。比如,[x**2 for x in range(5)]会创建列表[0,1,4,9,16]。这是因为变量x首先绑定到range(5)的第一个元素0,此时表达式x**2的值即(0)会加入列表,然后x 绑定到range(5)的第二个元素1,此时表达式x**2的值即(1)会加入列表,以此类推直至遍历完range(5)中的所有元素。
print([x**2 for x in range(5)])
[0,1,4,9,16]
注意表达式expression 可能与变量 x 无关。比如,matrix=[[0,0,0] for x in range(3)] 创建一个嵌套列表[[0,0,0],[0,0,0],[0,0,0]]。这里无论x取值如何,表达式expression 的值始终是[0,0,0]。再次强调,虽然matrix[0],matrix[1],matrix[2]的值都是[0,0,0],但实际上它们绑定到不同的列表,所以修改matrix[0]的值并不影响matrix[1]和matrix[2]的值。
matrix=[[0,0,0] for x in range(3)]
print(matrix)
[[0,0,0],[0,0,0],[0,0,0]]
matrix[0][0]=1
print(matrix)
[[1,0,0],[0,0,0],[0,0,0]]
列表推导中还可以引入条件判断,形如[expression for x in iterable if condition],其含义是依次将可迭代对象iterable中的元素赋值给变量x , 并且仅当表达式condition 为真时才求解表达式expression ,并将其值放入新建的列表中。比如[x for x in range(10) if x % 2==1] 会创建[1,3,5,7,9]。这是因为仅当表达式x %2==1为真时(即x为奇数),才会将表达式x的值加入列表中。
print([x for x in range(10) if x %2==1])
[1,3,5,7,9]
又比如[x for x in 'alice' if x in 'aeiou']会创建列表['a','i','e']。这是因为仅当表达式 x in 'aeiou'为真时,才会将表达式x 的值加入列表。