本篇试图回答下面两个问题:
list,tuple和str的底层是怎么实现的?
它们之间有什么异同?
首先定义一下数组(array),这个数组跟其他语言说的数组不太一样,这个数组只是内存上的概念。数组是一片连续的内存块,可以在常数时间索引每个内存块。
list,tuple和str都属于sequence,sequence底层都是用数组实现的。下面详细描述各个sequence。
str:在Python中,字符串由单独的str类表示,每个字符由两字节内存表示。比如字符串“SAMPLE”就由一个12字节的、六个单位的数组表示。str是immutable,如果要“修改“一个字符串,Python会开辟一块新的内存储存修改后的字符串,然后把引用指向新的内存块。
list:list底层也是用数组实现,与str不同的是,list的数组储存的不是对象本身,而是对象的引用,这种数组叫做引用型结构(referential array)。也因为list是引用型数组,所以list可以存储任何对象。(实际上list存储的是引用)。每次创建一个新list对象,会分配比需要多一些的内存,以供list的增加(append,extend)之用。如果一个list对象的内存占满了还要继续增加,Python就会开辟一块新内存,然后把之前的复制过来,让引用指向新的内存。list是mutable的含义是其中每个元素的内容(引用)可以改变,这样对于单个元素的更改就不必像str一样开辟新内存。
tuple:tuple也是引用型数组,与list的不同是tuple是immutable。
参考文献:
Data Structures and Algorithms in Python, WILEY