列表切片nums[:]是否创建副本?此代码是否分配额外内存、时间复杂度为O(1)?
问题解答
nums[:] 是否会创建列表的副本?
得分两种场景看:
- 当
nums[:]作为赋值符号右侧的表达式时,它会生成原列表的浅副本; - 代码里左侧的
nums[:]是切片赋值的目标,它不是创建副本,而是指定要原地修改原列表的所有元素,不会生成新的列表对象。
不过你这段代码里,右侧的nums[-k:] + nums[:-k]会先创建一个完整的新列表,这部分用到了切片生成副本的操作。
是否会分配额外内存?
会。因为nums[-k:] + nums[:-k]会生成一个和原列表长度相同的临时列表,这个临时列表需要占用额外的内存空间。虽然最后是把元素复制回原列表,但这个临时列表的内存分配是不可避免的。
时间复杂度是否为O(1)?
不是,时间复杂度是O(n)(n为列表的长度)。原因如下:
- 拼接两个切片生成新列表时,需要遍历所有元素完成拼接,这是O(n)的操作;
- 切片赋值
nums[:] = ...会把临时列表里的所有元素逐个复制到原列表中,这也是O(n)的操作。
两者叠加后,整体时间复杂度为O(n)。
内容的提问来源于stack exchange,提问作者jaroslaw
相关产品推荐
相关产品推荐

