Python 列表(List)与元组(Tuple)深度对比
wptr33 2025-08-05 21:48 5 浏览
列表和元组是 Python 中最常用的两种序列类型,它们在许多方面相似,但在关键特性上有显著区别。下面从 7 个维度进行详细对比分析。
一、基本定义差异
特性 | 列表(List) | 元组(Tuple) |
语法 | 方括号 [ ] | 圆括号 ( ) |
示例 | [1, 2, 3] | (1, 2, 3) |
可变性 | 可变(mutable) | 不可变(immutable) |
类型 | <class 'list'> | <class 'tuple'> |
# 创建示例
lst = [1, 2, 3] # 列表
tup = (1, 2, 3) # 元组
single_tup = (42,) # 单元素元组必须加逗号
二、可变性差异(核心区别)
列表的可变操作
colors = ['red', 'green', 'blue']
# 修改元素
colors[1] = 'yellow' # ['red', 'yellow', 'blue']
# 添加元素
colors.append('black') # 末尾添加
colors.insert(1, 'white') # 指定位置插入
colors.extend(['pink', 'cyan']) # 合并列表
# 删除元素
del colors[0] # 删除指定位置
colors.remove('blue') # 删除指定值
colors.pop() # 删除并返回末尾元素
元组的不可变性
colors = ('red', 'green', 'blue')
# 以下操作都会引发TypeError
colors[1] = 'yellow' # 不能修改
colors.append('black') # 无此方法
del colors[0] # 不能删除元素
三、性能对比
操作 | 列表 | 元组 |
创建速度 | 较慢(需分配可变缓冲区) | 较快(固定内存块) |
内存占用 | 较大(存储额外信息) | 较小(结构简单) |
访问速度 | 略慢 | 略快 |
import sys
from timeit import timeit
# 内存占用比较
lst = [1, 2, 3, 4, 5]
tup = (1, 2, 3, 4, 5)
print(sys.getsizeof(lst)) # 120 bytes (64位Python)
print(sys.getsizeof(tup)) # 80 bytes
# 创建速度比较
print(timeit('[1,2,3,4,5]')) # 约0.1微秒
print(timeit('(1,2,3,4,5)')) # 约0.02微秒
四、方法支持对比
列表的丰富方法
lst = [1, 2, 3]
# 修改方法
lst.append(4) # [1,2,3,4]
lst.clear() # []
lst.copy() # 浅拷贝
lst.extend([5,6]) # [1,2,3,5,6]
lst.insert(0, 0) # [0,1,2,3]
lst.pop() # 删除并返回末尾元素
lst.remove(2) # 删除第一个匹配项
lst.reverse() # 原地反转
lst.sort() # 原地排序
元组的有限方法
tup = (1, 2, 2, 3)
# 仅有两个方法
tup.count(2) # 返回2(计数)
tup.index(3) # 返回3(首次出现的索引)
五、使用场景对比
适合使用列表的场景
- 需要频繁修改数据集合
- 需要实现栈/队列等动态数据结构
- 需要各种内置操作方法
- 数据需要被多次修改传递
典型列表应用
student_scores = []
student_scores.append(85)
student_scores[0] = 90
student_scores.sort()
适合使用元组的场景
- 保证数据不被意外修改
- 作为字典的键(要求可哈希)
- 函数返回多个值
- 存储常量或配置信息
- 线程安全的数据共享
# 典型元组应用
RGB_COLORS = ('red', 'green', 'blue') # 常量
coordinates = { (35.68, 139.76): "Tokyo" } # 字典键
min_max = (min(data), max(data)) # 多返回值
六、特殊特性对比
列表的特殊特性
# 列表推导式
squares = [x**2 for x in range(10)]
# 可变嵌套结构
matrix = [[1,2], [3,4]]
matrix[0][1] = 5 # 修改嵌套列表
元组的特殊特性
# 元组解包
x, y, z = (1, 2, 3)
# 命名元组
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p.x) # 11
七、互相转换
# 列表转元组
lst = [1, 2, 3]
tup = tuple(lst) # (1, 2, 3)
# 元组转列表
tup = ('a', 'b', 'c')
lst = list(tup) # ['a', 'b', 'c']
总结选择建议
- 需要修改数据? → 选择列表
- 需要保证数据不变? → 选择元组
- 作为字典键使用? → 必须用元组
- 内存敏感/大量数据? → 优先考虑元组
- 需要丰富操作方法? → 选择列表
理解这些差异后,可以根据具体需求选择最合适的数据结构,写出更高效、更安全的 Python 代码。
道友还不点赞
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
因果推断Matching方式实现代码 因果推断模型
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)