一:列表简介:
1,列表可以包含任何种类的对象:数字、字符串甚至集合对象类型。列表都是可变对象,它们都支持在原处修改的操作,可以通过指定的偏移量和分片、列表方法调用、删除语句等方法来实现。关键的作用有一下几个:
a) 任意对象的有序集合:从功能上看,列表就是收集其他对象的地方,你可以把它们看作组。同时列表所包含的每一项都保持了从左到右的位置顺序(也就是说,它们是序列)。
b) 通过偏移读取:可以通过列表对象的偏移对其进行索引,也可以执行分片和合并置类的任务。
c) 可变长度、异构以及嵌套:与字符串不同的是,列表可以实地的增长或者缩短(长度可变),并且可以包含任何类型的对象而不仅仅是包含有单个字符的字符串(异构)。列表能够包含其他复杂的对象,又能够支持任意的嵌套,所以可以创建列表的子列表的子列表等。
d) 属于可变序列的分类:列表支持在原处的修改(他们是可变的),也可以响应所有针对字符串序列的操作,例如,索引、分片以及合并。唯一的区别:当应用于字符串上的合并和分片这样的操作应用于列表时,返回新的列表。然而列表时可变的,因此他们也支持字符串不支持的其他操作(例如,删除和索引赋值操作,他们都是在原处修改列表)。
e) 对象引用数组:实际上,从Python 解释器内部,列表就是C数组而不是链接结构。每当引用时,Python 总是会将这个引用指向一个对象,所以程序只需处理对象的操作,当把一个对象赋给一个数据结构元素或变量名时,python 总是会存储对象的引用,而不是对象的一个拷贝。
二:实际应用中的列表:
1,基本列表操作:由于列表是序列,它支持很多与字符串相同的操作。例如,列表对“+”和“*”操作的响应与字符串很相似,也是合并和重复,只不过结果是一个新的列表,而不是一个字符串。
2,列表迭代和解析:列表解析只不过是通过对序列中的每一项用一个表达式来构建一个新的列表的方式:
>>>res = [c *4 for c in "spam"] >>>res ['ssss','pppp','aaaa','mmmm']
另外,内置的函数map做类似的工作,但它对序列中的 各项应用一个函数并把结果收集到一个新的列表中:
>>>list(map(abs,[-2,-1,0,1,2]))
[2,1,0,1,2]
3,索引、分片和矩阵:由于列表是序列,对于序列而言,索引和分片操作与字符串中的操作基本相同。但是索引时返回的是索引的一个对象,而分片的返回结果往往是返回一个新的列表。注意:由于可以在列表中嵌套列表(和其他对象类型),有时需要将几次索引操作连在一起使用来深入到数据结构中去。例如矩阵(多维数组)就是嵌套了子列表的列表:
>>>matrix = [[1,2,3],[4,5,6],[7,8,9]] >>>matrix[1] #一次索引将会得到一整行,也就是嵌套的子列表 [4,5,6] >>>matrix[1][1] #两次索引得到某一行里的其中一项 5
三:原处修改列表:
1,由于列表是可变的,它们支持原处修改列表对象的操作。注意:如果你在原处修改一个对象时,可能同时会影响一个以上指向它的引用。
2,索引与分片的赋值:当使用列表的时候,可以将它赋值给一个特定项(offset)或者整个片段(分片)来改变它的内容:
>>>L = ['spam','SPAM','Spam!'] #原地索引赋值修改 >>>L[1] = 'eggs' >>>L ['spam','eggs','Spam!'] >>>L[0 : 2] = ['eat','more'] #分片的赋值 >>>L ['eat','more','Spam!']