问题的历史:切片(slicing)从一开始就在Python中出现,作为一种语法方便的方式,用于获取序列的片段,无需手动遍历循环。
问题:来自其他语言的程序员经常使用显式循环来处理子列表。这增加了代码的体积并降低了性能。
解决方案:列表切片允许以紧凑、清晰和高效的方式获取列表、字符串或其他序列的部分。切片不会修改原始对象,而是返回其副本或视图(对于某些类型)。
代码示例:
lst = [0, 1, 2, 3, 4, 5] sub = lst[1:4] # [1, 2, 3] reverse = lst[::-1] # [5, 4, 3, 2, 1, 0] every_second = lst[::2] # [0, 2, 4]
主要特性:
切片中值的改变会影响原始列表吗?
不会:当你给切片赋值一个新列表时,你在这些位置上改变了原始列表;但是通过切片获取到的是一个新的列表。
示例:
lst = [1, 2, 3, 4] lst2 = lst[1:3] # [2, 3] lst2[0] = 20 # 不影响lst:lst2是一个新对象
但是:
lst[1:3] = [7, 8] # 这直接修改了lst
切片负值索引是如何工作的?
负值索引从末尾开始计算:-1是最后一个元素,-2是倒数第二个。例如,lst[:-1]意味着所有元素,除了最后一个。
如果在切片中超出列表边界,会发生什么?
Python "聪明" 地处理这些情况:不会有错误,只是切片会根据可用边界进行修剪。例如,lst[100:200]将返回一个空列表或最大可能的子列表。
处理列表需要数百行嵌套循环和条件来"切割"输入数据,代码复杂且速度慢。
优点:
缺点:
同样的代码使用切片和内置函数重新编写,占用的行数更少,容易测试。
优点:
缺点: