Python之集合类型(底层)细节

一、列表和元组

列表是动态的,其大小可以改变的,元组是不可变得,一旦创建就不能修改,二者都表示对象序列。

实现细节:

列表实现是基于数组或是基于链表结构的。在CPython中,列表被实现为长度可以变化的数组。
从细节上看,Python中列表是由其对象的引用组成的连续数组,指向这个数组的指针被保存在列表头结构中,在每次修改列表时,都需要重新分配。但是Python中创建引用数组时采用指数过分配,所以并不是每次分配都是改变数组大小。
列表的append操作时,并不是每一次都是重新申请地址,而是一次申请多个地址空间,下一次执行append操作时,就不会再申请,直到当前数组的空间不够用时,再申请。列表的pop操作时,每弹出一个元素,就会调整数组的长度,但是并不是立即释放空间,而是当前的数组长度小于分配空间一半时,回收部分地址空间。

#列表的实现
typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值