python中的列表和元组有什么区别?字符串和对象等列表和元组都支持负索引In[8]:nums[-2]Out[8]:'ad'In[9]:tp[-2]Out[9]:'33'listand两个元组都支持切片操作In[10]:nums[1:3]Out[10]:[3,'ad']In[11]:tp[1:3]Out[11]:(3,'33')list和tuple可以自由嵌套In[12]:nums=[[1,2,3],['s','ff'],['34',3,5]]In[13]:tp=((23,4,'f'),45,'d',('dd',4,'ff'))列表和元组的一些区别列表是动态的,长度不固定,可以任意添加、删除和修改元素元组是静态的,长度在初始化时就已经确定,无法更改,更不用说添加、删除和修改元素了。从图中可以看出,我们对list的修改是成功的,但是对tuple的修改的时候确实会报错,如果要对tuple进行修改怎么办呢?只能重新开一块内存,重新生成新到的元组。从tuple的源码也可以看出,内置的方法只有两个,一个是统计元素出现的次数,一个是查询元素的索引。列表和元组存储的区别我们先看一个例子在[19]中:nums=['a',1,2]在[20]中:tp=('a',1,2)在[21]中:nums.__sizeof__()Out[21]:64In[22]:tp.__sizeof__()Out[22]:48这里构造了一个list和一个tuple。它们存储的内容是一样的,__sizeof__方法可以打印出系统分配的空间大小。可以看出它们占用的内存空间不同,存储的内容是一样的,但是list比tuple多占用16内存。我们来看一个数组的内存分配过程:In[23]:l=[]In[24]:l.__sizeof__()//空链表分配40字节内存Out[24]:40In[25]:l.append('a')//一个一个添加元素后,给链表分配72字节内存,每个字符8字节//即一次性分配4个字符的内存空间中[26]:l.__sizeof__()Out[26]:72In[27]:l.append('b')//添加更多的字符,占用相同的内存In[28]:l.__sizeof__()Out[28]:72In[29]:l.append('c')//添加更多的字符,占用相同的内存In[30]:l.__sizeof__()Out[30]:72In[31]:l.append('d')//添加更多字符,占用相同内存In[32]:l.__sizeof__()Out[32]:72In[33]:l.append('e')//添加更多元素,内存不足,触发重新分配内存In[34]:l.__sizeof__()Out[34]:104可以看出,为了能够实时跟踪内存的使用情况,当空间不足时,分配额外的空间,additio分配了最终内存,还需要存储指向相应元素的指针。我们可以看到,为了减少每次增加/删除操作的空间分配开销,Python在每次分配空间的时候都会分配更多的空间。这种机制(过度分配)保证了其操作的效率:增加/删除的时间复杂度为O(1)。但是对于元组,情况就不同了。元组的大小是固定的,元素是不可变的,所以存储空间是固定的。因此,在存储大量数据时,需要考虑这种差异。如果数据变化的可能性不高,就用元组存储。如果数据需要经常修改和增加,使用列表。欢迎大家访问我的博客,更多实测内容!!
