网淘巴来吧,欢迎您!

返回首页 微信
微信
手机版
手机版

Python元组和列表的区别

2021-05-16 新闻来源:网淘巴 围观:673
''

一、列表和元组的区别

列表:内容和长[文]度都可以改变,[章]也就是动态的,[来]内存是动态分配[自]的。

元组:内容和长[网]度都不可改变,[淘]静态的,内存一[巴]经分配不可改变[文],访问速度快。[章]

元组缓存于Py[来]thon运行时[自]环境,这意味着[网]我们每次使用元[淘]组时无须访问内[巴]核去分配内存。[文]

 

二、列表(Li[章]st)

列表一旦创建了我们就可以根据自己的需要随意改变它的内容:

>>> l = [1, 2, 3, 4, 5, 6]>>> l[0] = l[2] * l[3]>>> l[12, 2, 3, 4, 5, 6]

另外我们可以给列边添加新的数据来增加其大小:

>>> len(l)6>>> l.append(7)>>> l[12, 2, 3, 4, 5, 6, 7]>>> len(l)

这是因为动态数组支持resize操作,可以增加数组的容量。当一个大小为N的列表第一次需要添加数据时,Python会创建一个新的列表,足够放原来的N个元素以及额外添加的元素。不过,实际分配的并不是N+1个元素,而是M个元素,M > N, 这是为了给未来的添加预留空间。然后旧列表的数据被复制到新列表中,旧列表则会被销毁。从设计理念上来说,第一次添加可能是后续多次添加的开始,通过预留空间的做法,我们就可以减少这一分配空间的操作次数以及内存复制的次数。这点非常重要,因为内存复制可能非常的昂贵,特别是当列表大小开始增长以后。

三、元组(Tu[来]ple)

元组是固定且不可改变的。这意味着一旦元组被创建,和列表不同,它的内容无法被修改或它的大小也无法被改变。

>>> t = (1, 2, 3, 4)>>> t[0] = 5Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment

虽然它们不支持改变大小,但是我们可以将两个元组合并成一个新元组。这一操作类似列表的resize操作,但我们不需要为新生的元组分配任何额外的空间:

>>> t1=(1,2,3,4)
>>> print(t1[0])
1
>>> t1[0]=2
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t2=(6,7)
>>> t3=t1+t2
>>> print(t3)
(1, 2, 3, 4, 6, 7)
>>> 

如果我们将其与列表的append操作比较,我们会看到它的复杂度是O(n)而不是列表的O(1)。这是因为对元组每添加一个新元素都会有分配和复制操作,而不是像列表那样仅在额外的空间耗尽时发生。所以元组并没有提供一个类似append的自增操作,任意两个元组相加始终返回一个新分配的元组。

 

元组的静态特性[自]的另一个好处体[网]现在一些会在P[淘]ython后台[巴]发生的事情:资[文]源缓存。

Python是[章]一门垃圾收集语[来]言,这意味着当[自]一个变量不再被[网]使用时,Pyt[淘]hon会将该变[巴]量使用的内存释[文]放回操作系统,[章]以供其他程序([来]变量)使用。然[自]而,对于长度为[网]1~20的元组[淘],即使它们不在[巴]被使用,它们的[文]空间也不会立刻[章]还给系统,而是[来]留待未来使用。[自]这意味着当未来[网]需要一个同样大[淘]小的新的元组时[巴],我们不再需要[文]向操作系统申请[章]一块内存来存放[来]数据,因为我们[自]已经有了预留的[网]空间。

这看上去可能是[淘]个细微的好处,[巴]但是实际上是元[文]组一个很神奇的[章]地方:它们可以[来]被轻松快速地创[自]建,因为它们可[网]以避免跟操作系[淘]统频繁的打交道[巴],而后者会花很[文]长的时间。

 

免责申明
部分文章来自各大搜索引擎,如有侵权,请与我联系删除。
打赏

本文链接:https://www.wtao8.com/post/100.html 转载需授权!

分享到:

相关文章

龙年
大发