一、列表和元组
列表是动态的,其大小可以改变的,元组是不可变得,一旦创建就不能修改,二者都表示对象序列。
实现细节:
列表实现是基于数组或是基于链表结构的。在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