HOWTO · Python

Python 中 `[:-1]` 的含义

了解 Python 的 `[:-1]` 切片如何返回不含最后一个元素的序列。

本页内容

在 Python 中,sequence[:-1] 会返回一个新的序列,其中包含除最后一个元素之外的每个元素。它适用于字符串和列表,且不会改变原始序列。这个表达式将切片与 -1 结合,-1 在从末尾进行索引时标识最后的位置。

Python 中的切片

Python 提供两种等价的方式来描述切片:slice() 构造函数和索引语法。一般形式是 sequence[start:stop:step];每个部分选取从何处开始、在何处停止,以及前进多远。start 和 stop 边界标识位置,而 step 控制方向和间距。

停止位置被排除在外。在索引 4 结束的切片包含 4 之前的位置,因此 sequence[1:4] 选取索引 1、2 和 3。索引可以从末尾计数:-1 指最后一个元素,-2 指其前一个元素。省略的边界不同于明确写出 -1:在通常的正步长下,省略的 start 从序列的开头开始,省略的 stop 继续到其末尾。默认值取决于步长的方向。在负步长下,遍历从右向左移动;省略的 start 从最后的位置开始,而省略的 stop 继续超过第一个位置。这种依方向而定的行为,正是省略的 stop 不同于明确写出 -1 的原因。

构造函数接受相同的部分:slice(start, stop, step)。与索引语法不同,你不能将构造函数参数留空;用 None 表示省略的边界。例如,slice(None, 5) 使用省略的 start 和为 5 的 stop,对于正步长而言等同于 sequence[:5]。使用一个参数时,slice(5) 将 stop 设为 5;它并不表示“从索引 5 开始”。当切片必须作为值存储或传递时,这些形式很有用。

Python 中 [:-1] 的含义

在 sequence[:-1] 中,start 被省略,因此切片从开头开始。stop 是 -1,它标识最后一个元素,并且由于 stop 被排除,该元素不会被复制到结果中。例如,将其应用到 "Python" 会得到 "Pytho";将其应用到 ["red", "green", "blue"] 会得到 ["red", "green"]。

同一个表达式可以应用到不同的序列类型,并得到相同的结果模式。这个独立完整的示例使用一个短字符串和一个颜色名称列表,然后将每个切片值显示在各自的行上。输入值让人容易看出哪个最后项目被省略,而打印出的值显示原始数据仍可供程序稍后使用。

word = "Python"
colors = ["red", "green", "blue"]

print(word[:-1])
print(colors[:-1])
Pytho
['red', 'green']

切片会创建一个结果,而不是改变原始序列。这使得 [:-1] 在你需要一个不含最后字符或项目的版本、但稍后仍需要原始值时很有用。它也适用于空序列,会返回另一个空序列。对于只有一个元素的序列,结果为空,因为其唯一的元素就是最后一个元素。同一个 stop 边界规则解释了这两个结果。