Python中切片stop值大于字符串长度的底层实现与效率问题
你的猜测完全正确,my_string[:10]和my_string[:]在该场景下的效果完全一致,都会返回原字符串的完整浅拷贝。
底层实现逻辑
Python处理任意序列的切片操作时,都会先对start/stop/step三个参数做O(1)复杂度的边界校准,通用校准规则如下:
- 未显式传值时,
start默认取0、stop默认取序列总长度、step默认取1 - 若
stop传入值大于序列实际总长度,会直接被替换为序列总长度 - 若
start为负数,会被校准为max(0, start + 序列总长度);若最终校准后的start大于等于stop,则直接返回空序列
你给出的示例中,字符串my_string的实际长度为3,传入的stop=10在校准阶段会被直接修正为3,最终执行的切片逻辑等价于my_string[0:3:1],和my_string[:]的校准结果、执行流程完全没有区别。
以CPython的实现为例,字符串是不可变对象,切片操作会先根据校准后的起止位置计算需要拷贝的字符长度,申请对应大小的内存后复制对应范围的字符数据。该场景下校准后的拷贝长度就是原字符串总长度,因此就是全量复制,和[:]的执行逻辑完全一致。
运行效率说明
字符串切片的时间复杂度为O(k),其中k是最终切片结果的字符长度,和你传入的stop参数大小没有关系:边界校准是固定的常数时间操作,无论你传入的stop是10还是10000,只要校准后的结果都是3,最终需要执行的拷贝量就是3个字符,耗时完全相同。
内容的提问来源于stack exchange,提问作者robocat314
相关产品推荐
相关产品推荐

