一、 列表可变,元祖不可变
1. 为什么元祖不可变?
- 从内存来解释,元祖的每个值在内存中存放于一个地址值,这个地址值是不可变的。
2. 修改元祖中的列表元素值,元祖还是不可变的吗?
- 可以向元祖中添加扩充元素,这不代表元祖可变,id(元祖)会发现,它的地址值已经变化。创建了另一个指向同一对象的元祖
元祖可以接受一个可变对象作为元素,比如元祖中包含一个列表,修改了元祖中的列表里的值,这个元祖中的列表的地址值值固定的,虽然列表的值变了,但列表的地址值不变,元祖没变。
二、元祖速度快于列表
它们都是引用数据类型。但元祖更快
- 生成速度(元祖大大快于列表)
- 迭代速度(遍历速度)元祖快一点
- 索引速度差不多
- 对于这些速度比较的实验,网上很多。(随便贴出一个链接叭
为什么元祖快
- 因为元祖不可变,它在cpython中被存储在一块固定的连续内存中,创建元祖时一次性分配内存;列表是存储在两块内存中,一块固定内存,存放列表对象的信息,一块不固定大小的内存,存放数据。
查找元祖时,可以快速定位(C中的列表),查找列表则需要遍历(C中的链表) - 编译时,python编译器把元祖存储在“常量表”中,运行时只需找到这些预构建的常量元祖;由于list可变,需要在运行时构建,分配内存