list复制_深入 Python(18)-List 的切片

1a3144d0729759c029128d444a687d82.png

从 List 中删除元素与 pop 类似,只不过会将弹出元素直接删除,内存操作及性能大体相同,不再赘述。

List 通过切片快速截取片段,切片需要指定起、止索引,过程也很简单,实现如下:

static 

切片实际上是创建原始 List 片段的副本,而非真的 “切” 片,可能 slice 翻译为 “片段” 更合适。切片的基本逻辑很直接:

  • 创建一个空 List;
  • 从原始 List 的 start 到 stop,将内容复制到新数组;

特别需要注意的是,空 List 是通过 list_new_prealloc 函数分配,如果还记得之前的内容,PyList_New 也可以创建指定长度的 List, 这里没有直接使用 PyList_New 创建空白 List,主要原因是传入 size
的 PyList_New 函数会同时指定 ob_size,这与实际上 List 中没有任何元素不符。所以 list_new_prealloc 中只是用 PyList_New(0) 创建了 List Object 结构,之后单独创建 ob_item array,这样 ob_size 为 0, allocated 为 size,相当于预分配。

整个过程看起来像这样:

1d12ba132c52345bcdc51fed38b15a32.gif

这也就很容易解释,修改切片不会影响原 List 的原因了,因为切片是原 List 的副本。

另外,通过下面方式可以获得 List 的浅拷贝:

list1 

关注我,了解程序员的烧脑日常,还有开源 Python 教程。

5e0cb634753d547edfffbf69a45aa904.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值