还可以使用索引从列表一次获取多个元素。这叫做列表分片(slicing)。
>>> print letters[1:4]['b', 'c', 'd']
与 for 循环中的 range 类似,分片获取元素时,会从第一个索引开始,不过在达到第二个索引之前停止。正是因为这个原因,前面的例子中我们只取回 3 项,而不是 4 项。要记住这一点,一种方法就是牢记取回的项数总是两个索引数之差(4 – 1 = 3,所以取回 3 项)。
关于列表分片,还有一个重要的问题需要记住:对列表分片时取回的是另一个(通常更小的)列表。这个更小的列表称为原列表的一个分片(slice)。原来的列表并没有改变。这个分片是原列表的部分副本(copy)。
下面来看这有什么不同:
>>> print letters[1]b>>> print letters[1:2]['b']
在第一种情况下,我们取回一个元素。在第二种情况下,取回的是包含这个元素的一个列表。这个差别很微妙,但是你必须知道。在第一种情况下,我们使用了一个索引从列表得到一个元素。第二种情况下则是使用分片记法来得到列表的一个单元素分片(只包含一个元素的分片)。
要真正了解二者的区别,可以试试这些命令:
>>> print type(letters[1])<type 'str'>>>> print type(letters[1:2])<type 'list'>
这里分别显示了两个结果的类型(type),从中可以清楚地看出,前一种情况下得到了一个元素(这里是一个字符串),后一种情况下得到的是一个列表。
对列表分片时会得到一个较小的列表,这是原列表中元素的一个副本。这说明,可以修改这个分片,而原列表不会受到任何影响。
分片简写
使用分片时可以采用一些简写形式。即使采用这些简写,也不会减少太多键入。不过程序员总是很懒,所以他们会大量使用简写。我希望你知道这些简写是什么,这样当你在别人的代码中看到这些简写时就能认出来,而且明白是什么意思。这很重要,因为学习新的编程语言时(或者笼统地说,学习编程时),查看并且理解其他人的代码是一种很好的方法。
如果你想要的分片包括列表的开始部分,简写方式是使用冒号,后面是想要的元素个数,例如:
>>> print letters[:2]['a', 'b']
注意,冒号前面没有数字。这样就会得到从列表起始位置开始一直到(但不包括)指定索引之间的所有元素。
要得到列表末尾也可以用类似的记法。
>>> letters[2:]['c', 'd', 'e']
使用一个后面跟冒号的数,这样可以得到从指定索引到列表末尾的所有元素。
如果没有放入任何数,而只有冒号,就可以得到整个列表:
>>> letters[:]['a', 'b', 'c', 'd', 'e']
应该记得吧?我说过分片就是建立原列表的副本。所以 letters[:] 会建立整个列表的副本。如果你想对列表做些修改,但是同时还想保持原来的列表不做任何改变,使用这种分片就会很方便。