你知道python中的列表和元组都有哪些区别吗?

列表与元组的区别
本文对比了Python中列表(list)和元组(tuple)的特点及应用差异,包括它们的数据类型、索引、切片操作、嵌套特性以及动态与静态属性。此外还详细探讨了两者在内存分配和存储效率上的不同,帮助开发者选择合适的数据结构。

列表(list)和元组(tuple)的一些基础

list和tuple都是一个可以放置任意数据类型的有序集合,都是既可以存放数字、字符串、对象等
在这里插入图片描述
list和tuple都支持负索引

In [8]: nums[-2]
Out[8]: 'ad'
In [9]: tp[-2]
Out[9]: '33'

list和tuple都支持切片操作

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的一些区别

列表是动态的,长度大小不固定,可以随意的增加、删除、修改元素

元组是静态的,长度在初始化的时候就已经确定不能更改,更无法增加、删除、修改元素

在这里插入图片描述
从图中看出我们对list做出修改是成功的,但是对tuple修改的时候,确抛出了错误,那如果想对tuple做出改变该如何做呢?只能重新开辟一块内存,重新生成新到的tuple了。
在这里插入图片描述
从tuple的源码中也可以看出,只有两个自带的方法,一个是统计元素出现的次数一个是查询元素的索引。

list和tuple存储方式的差异

我们先来看个例子

In [19]: nums=['a',1,2]
In [20]: tp=('a',1,2)
In [21]: nums.__sizeof__()
Out[21]: 64
In [22]: tp.__sizeof__()
Out[22]: 48

这里构造了一个list和一个tuple。他们存储的内容是相同的,__sizeof__方法可以打印系统分配空间的大小。可以看到他们所占用的内存空间是不同的,存储的内容相同,但是list比tuple多占用了16自己的内存。

先来看一下一个数组的内存分配过程:

In [23]: l=[]

In [24]: l.__sizeof__()  // 空列表分配了40字节的内存
Out[24]: 40

In [25]: l.append('a')  // 增加了一个一个元素后,给列表分配了72字节的内存,一个字符8个字节
												// 那就是一次性分配了4个字符的内存空间

In [26]: l.__sizeof__()
Out[26]: 72

In [27]: l.append('b')  // 再增加字符,占用内存不变

In [28]: l.__sizeof__()
Out[28]: 72

In [29]: l.append('c')  // 再增加字符,占用内存不变

In [30]: l.__sizeof__()
Out[30]: 72

In [31]: l.append('d')  // 再增加字符,占用内存不变

In [32]: l.__sizeof__()
Out[32]: 72

In [33]: l.append('e')  // 再添加元素,内存不够,触发重新的内存分配

In [34]: l.__sizeof__()
Out[34]: 104

可以看出list为了能够实时追踪内存的使用情况,当空间不足时以及分配额外空间,额外的多分配了内存,而且还需要存储指针,指向对应的元素。

我们可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些,这样的机制(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。但是对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定。

所以说在存储大量的数据的时候,这种差异是需要考虑的,如果数据发生变更的可能性不大,就用元组存储,如果数据是需要频繁的进行数据的修改增加,就使用列表

看完点赞~养成好习惯,若是你对软件测试感兴趣或者想要深入发展了解,可以加入我们。642830685,群内免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

<think> 我们正在讨论Python列表(list)元组(tuple)的区别主要区别包括: 1. 可变性:列表是可变的(mutable),而元组是不可变的(immutable)。 2. 语法:列表使用方括号[],元组使用圆括号(),但元组的创建也可以不需要括号,仅用逗号分隔。 3. 性能:由于元组的不可变性,它们在存储操作上可能比列表更高效,尤其是在作为字典键或用于集合中时(因为不可变对象才能被哈希)。 4. 使用场景:列表用于需要动态改变内容的情况,元组用于不希望内容被改变的情况,例如作为字典的键或函数返回值(当返回多个值时,实际上是返回一个元组)。 下面我们通过一些代码示例来说明这些区别。 </think> 在Python中,列表(list)元组(tuple)都是序列类型容器,但它们有核心区别: ### 主要区别: 1. **可变性** - 列表是**可变的**(mutable):创建后可以修改内容 - 元组是**不可变的**(immutable):创建后内容不可修改 2. **语法** - 列表用方括号:`[1, 2, 3]` - 元组用圆括号:`(1, 2, 3)` 或逗号分隔:`1, 2, 3` 3. **性能** - 元组创建访问速度更快(轻量级) - 列表需要额外内存存储可变性信息 4. **使用场景** - 列表:存储需要动态修改的数据集合 - 元组:存储不应修改的数据(如字典键、常量集合) ### 代码示例: ```python # 创建示例 my_list = [1, 2, 3] # 列表 my_tuple = (1, 2, 3) # 元组 # 尝试修改(列表允许,元组报错) my_list[0] = 99 # 成功 → [99, 2, 3] my_tuple[0] = 99 # TypeError: 'tuple' object does not support item assignment # 哈希能力(元组可哈希,列表不可) hash(my_tuple) # 返回哈希值 hash(my_list) # TypeError: unhashable type: 'list' # 内存比较 import sys sys.getsizeof(my_list) # 通常比元组大(示例:120字节) sys.getsizeof(my_tuple) # 更小(示例:64字节) # 扩展操作差异 my_list.append(4) # 成功 → [1, 2, 3, 4] my_tuple.append(4) # AttributeError: 'tuple' object has no attribute 'append' ``` ### 何时选择: | 场景 | 推荐类型 | |----------------------|----------| | 需要动态增删元素 | 列表 ✅ | | 作为字典键使用 | 元组 ✅ | | 存储常量/配置数据 | 元组 ✅ | | 需要更高读写性能 | 元组 ✅ | | 实现栈/队列等数据结构 | 列表 ✅ | ### 注意事项: 1. 单元素元组需额外逗号:`(42,)`(无逗号则视为整数) 2. 元组虽不可变,但若元素是可变对象(如列表),其内容仍可修改: ```python t = ([1, 2], 3) t[0][0] = 99 # 允许 → ([99, 2], 3) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值