源码可以在点这里:链接
list的底层实现我已经介绍过了。和我想的类似,里面的元素就是指针
最近看了看redis的数据类型的底层实现代码,发现也是用C写的,里面的很多实现真的和python中的实现很类似
果然大佬的思想都是这么强,英雄所见略同哈哈
list和tuple很大的区别就是一个可变一个不可变,可变和不可变的概念我也不介绍了,大家可以自行baidu,简单来说可变就是该地址处的值可以改变,不可变则反之
list被实现为长度可变的数组,每次都会分配略大的内存防止频繁的申请分配内存,连续的一块的内存
tuple:大家可以根据学过的C/C++思考一下是怎么实现的,所以建议学python也要对C要有一定认识
- 不可改变体现在:本身长度不能变,里面的元素不能变,元素是指针常量不是常量指针,但是元素指向的是一个可变对象如list,那么这个list是可变的,因为list首地址没变,它里面的东西tuple是不知道有没有变得
- tuple本身为一个结构体,结构体里面有一个二级指针,这是常量二级指针,可以形成一个指针数组而不是数组指针
- 内部是连续的内存,因为是数组
dict其他语言有的称为map
- dict的key是不可变对象,因为要确保经过hash算法之后得到的地址唯一
- 另外,即使字典中的key被remove,但依旧保持这个hash,也就是说,遍历的时候,时间复杂度取决于曾经这个字典拥有的最大键值对的数量
- 内部构造与redis类似:用桶数组和链表来解决hash冲突(也就是链地址法)
- 最新的dict已经是insert ordered,原来的话是根据hash值,乱序的,pop不一定是最后一个插入的键值对
set:允许空值的dict
对dict有进行优化,在插入和删除元素的复杂度都将为常数级别,最坏也是O(n)