Python列表
1. 列表概述
列表是Python基本数据结构——序列。索引、 切片、 相加、 相乘和成员资格检查等序列通用操作也适用于列表。
2. 使用列表的注意事项
2.1 列表的引用
变量:变量是指向某个值的名称(符号)。
引用: 变量和对象之间的关联称为引用。引用是一个值,指向某些数据。
将列表赋值给变量实际是将列表的引用赋值给变量。
在下面这个例子中,有两个对同一个对象的引用。如果一个对象有多个引用,那它也会有多个名称,我们称这个对象是有别名的 。
如果一个有别名的对象是可变的,对其中一个别名的改变对影响到其它的别名
>>> a = [1, 2, 3] >>> b = a >>> b is a True >>> b[0] = 42 >>> a [42 , 2, 3]
对于不可变对象,比如字符串,则没有这个问题
2.2 copy()和 deepcopy()函数
要让a和b指向不同的列表,就必须将b关联到a的副本,可以用copy()函数避免2.1产生的问题
>>> import copy >>> spam = ['A', 'B', 'C', 'D'] >>> cheese = copy.copy(spam) # spam 和 cheese 变量指向独立的列表(即另一个列表) >>> cheese[1] = 42 >>> spam ['A', 'B', 'C', 'D'] >>> cheese ['A', 42, 'C', 'D']
如果列表中还包括列表(可变对象),可以用deepcopy()函数避免相关问题,详见Python字典一节。
2.3 就地修改
列表append方法就地修改列表。就地修改意味着它不会返回修改后的新列表(返回None),而是直接修改旧列表。其他一些列表方法也有这个性质
>>> x = [1,2,3] >>> y = x.append(4) # 不应这样操作 >>> print(y) None >>> x [1, 2, 3, 4]
3. 列表常用方法及代码实践(源自《Python编程快速上手 让繁琐工作自动化》)
# (列表)list_to_str.py ''' 假定有下面这样的列表: spam = ['apples', 'bananas', 'tofu', 'cats'] 编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项, 表项之间以逗号和空格分隔,并在最后一个表项之前插入 and。例如,将前面的 spam 列表传递给函数, 将返回'apples, bananas, tofu, and cats'。但你的函数应该能够处理传递给它的任何列表。 ''' # 关键是先在列表倒数第二的位置添加'and',再用字符串方法join,','join(seq)合并列表 # 仅能处理该题目,要处理任何列表有待改进 spam = ['apples', 'bananas', 'tofu', 'cats'] def list_to_str(lis): lis.insert(-1, 'and') lis=(' ').join(lis) # 注意两个单引号里面是有个英文空格 print(lis) return lis if __name__ == '__main__': list_to_str(spam)
# (列表)copy_matrix.py ''' 假定有一个列表的列表, 内层列表的每个值都是包含一个字符的字符串, 像这样: grid = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] 你可以认为 grid[x][y]是一幅“图” 在 x、 y 坐标处的字符, 该图由文本字符组成。 原点(0, 0)在左上角, 向右 x 坐标增加, 向下 y 坐标增加。复制前面的网格值, 编写代码用它打印出图像。 ..OO.OO.. .OOOOOOO. .OOOOOOO. ..OOOOO.. ...OOO... ....O.... ''' # 先打印矩阵第一列然后第二列,循环索引先后顺序要注意才能打印正确 grid = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] def copy_matrix(matrix): count=0 # 到一定行数换行打印顶的计数 for j in range(len(matrix[0])): for i in range(len(matrix)): print(matrix[i][j],end='') #这里的嵌套循环索引先后顺序要注意 count+=1 if count%len(matrix) == 0: print('') if __name__ == '__main__': copy_matrix(grid)