Python 列表(List)与元组(Tuple)详解 Python 列表List与元组Tuple详解核心区别一句话总结列表可变元组不可变。这一差异决定了它们各自的应用场景和性能特性。在 Python 中列表List和元组Tuple是两种常用的序列类型用于存储多个元素。它们的核心区别在于可变性列表是可变的元素可修改而元组是不可变的元素一旦创建就无法修改。本文将详细介绍两者的用法、区别及适用场景。列表List可变的序列列表是 Python 中最灵活的序列类型使用方括号[]定义元素之间用逗号分隔支持添加、删除、修改等操作。基本定义与创建# 空列表empty_list[]# 包含不同类型元素的列表Python 列表支持异构元素mixed_list[1,apple,3.14,True]# 嵌套列表列表中包含列表nested_list[1,[2,3],[4,[5,6]]]访问元素通过索引下标访问元素索引从0开始支持负数索引从末尾计数-1表示最后一个元素。fruits[apple,banana,cherry,date]# 访问单个元素print(fruits[0])# 输出apple第一个元素print(fruits[-1])# 输出date最后一个元素# 分片切片获取子列表语法为 [start:end:step]左闭右开print(fruits[1:3])# 输出[banana, cherry]索引1到2的元素print(fruits[:2])# 输出[apple, banana]从开头到索引1print(fruits[2:])# 输出[cherry, date]从索引2到结尾print(fruits[::2])# 输出[apple, cherry]步长为2间隔一个元素# 复制列表创建副本修改副本不影响原列表fruits_copyfruits[:]# 获取元素对应索引indexfruits.index(target)修改元素列表是可变的可直接通过索引修改元素numbers[1,2,3,4]numbers[1]20# 将索引1的元素改为20print(numbers)# 输出[1, 20, 3, 4]添加元素append(x)在列表末尾添加元素x。insert(index, x)在指定索引index处插入元素x。extend(iterable)将可迭代对象如列表、元组的元素添加到末尾。colors[red,green]colors.append(blue)# 末尾添加print(colors)# 输出[red, green, blue]colors.insert(1,yellow)# 索引1处插入print(colors)# 输出[red, yellow, green, blue]colors.extend([purple,orange])# 批量添加print(colors)# 输出[red, yellow, green, blue, purple, orange]删除元素del list[index]删除指定索引的元素。list.remove(x)删除第一个值为x的元素若不存在则报错。list.pop(index)删除并返回指定索引的元素默认删除最后一个。languages[Python,Java,C,Python]dellanguages[1]# 删除索引1的元素print(languages)# 输出[Python, C, Python]languages.remove(Python)# 删除第一个Pythonprint(languages)# 输出[C, Python]poppedlanguages.pop()# 删除最后一个元素print(popped)# 输出Pythonprint(languages)# 输出[C]常用操作len(list)获取列表长度。list.count(x)统计元素x出现的次数。list.sort()对列表排序原地修改。list.reverse()反转列表原地修改。nums[3,1,4,1,5]print(len(nums))# 输出5长度print(nums.count(1))# 输出21出现的次数nums.sort()# 排序print(nums)# 输出[1, 1, 3, 4, 5]nums.reverse()# 反转print(nums)# 输出[5, 4, 3, 1, 1]元组Tuple不可变的序列元组使用小括号()定义元素不可修改适合存储不需要变更的数据。基本定义与创建# 普通元组tup1(1,2,3,4)# 单元素元组必须加逗号否则会被视为普通括号single_tuple(5,)# 空元组empty_tuple()# 省略括号的元组Python 允许implicit_tuple10,20,30# 嵌套元组nested_tuple(1,(2,3),(4,5,6))访问元素元组的访问方式与列表完全相同支持索引和分片animals(cat,dog,bird,fish)print(animals[2])# 输出bird索引2的元素print(animals[-2])# 输出bird倒数第二个元素print(animals[1:3])# 输出(dog, bird)分片不可变性说明元组的元素一旦创建就无法修改试图修改会报错tup(1,2,3)tup[0]10# 报错TypeError: tuple object does not support item assignment注意如果元组中包含可变元素如列表则该元素内部可以修改mutable_in_tuple(1,[2,3],4)mutable_in_tuple[1][0]20# 元组中的列表元素可修改print(mutable_in_tuple)# 输出(1, [20, 3], 4)元组的常用操作虽然元组不可变但支持以下操作len(tuple)获取长度。tuple.count(x)统计元素x出现的次数。tuple.index(x)返回元素x第一次出现的索引。元组拼接创建新元组原元组不变。t1(1,2,3)t2(4,5)print(len(t1))# 输出3print(t1.count(2))# 输出1print(t1.index(3))# 输出2t3t1t2# 拼接元组创建新元组print(t3)# 输出(1, 2, 3, 4, 5)函数返回多参数严格来说一个函数只能返回一个值但是如果这个值是一个元组效果就会和返回多个值一样了def get_name_and_age(): name Alice age 25 return name, age # 这会返回一个元组 ((Alice, 25),) name, age get_name_and_age() print(name) print(age)列表与元组的核心区别特性列表List元组Tuple定义符号方括号[]小括号()可省略可变性可变可修改、添加、删除元素不可变元素创建后无法修改性能略低需维护可变结构更高内存占用少访问速度快适用场景元素需动态修改如数据收集元素固定不变如配置、常量哈希性不可哈希不能作为字典的键可哈希可作为字典的键如何选择列表还是元组用列表当需要添加、删除或修改元素时如动态收集用户输入、存储可变更的数据集。用元组当数据一旦创建就不需要修改时如存储配置项、函数返回多个值、作为字典的键。示例函数返回多个值本质是返回元组defget_user_info():nameAliceage30returnname,age# 隐式返回元组userget_user_info()print(user)# 输出(Alice, 30)元组name,ageuser# 解包元组特有的便捷操作print(name,age)# 输出Alice 30查看类型如果不确定值是什么类型可以使用type来进行判断type(6)classinttype(H)classstrfruits[apple,banana,cherry,date]type(fruits)classlisttup1(1,2,3,4)type(tup1)classtuple快速选型指南场景推荐类型动态收集用户输入列表 ✅存储配置常量如颜色RGB值元组 ✅作为字典的键元组 ✅函数返回多个值元组 ✅需要排序、反转、增删操作列表 ✅数据量大且只读提高性能元组 ✅与其他开发者协作明确数据不可变意图元组 ✅常见陷阱与最佳实践 陷阱 1使用可变对象作为默认参数# ❌ 错误示例默认参数是可变对象defadd_item(item,my_list[]):my_list.append(item)returnmy_listprint(add_item(1))# [1]print(add_item(2))# [1, 2] ← 意外多次调用共享了同一个列表# ✅ 正确做法defadd_item(item,my_listNone):ifmy_listisNone:my_list[]my_list.append(item)returnmy_listprint(add_item(1))# [1]print(add_item(2))# [2] 陷阱 2浅拷贝 vs 深拷贝importcopy nested[[1,2],[3,4]]# 浅拷贝只复制外层内层列表仍共享shallownested[:]shallow[0][0]99print(nested)# [[99, 2], [3, 4]] ← 原列表也被修改# 深拷贝完全独立deepcopy.deepcopy(nested)deep[0][0]999print(nested)# [[99, 2], [3, 4]] ← 原列表不受影响 陷阱 3列表乘法与引用# ❌ 错误创建了多个指向同一列表的引用matrix[[0]*3]*3# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]matrix[0][0]1print(matrix)# [[1, 0, 0], [1, 0, 0], [1, 0, 0]] ← 意外# ✅ 正确使用列表推导式matrix[[0]*3for_inrange(3)]matrix[0][0]1print(matrix)# [[1, 0, 0], [0, 0, 0], [0, 0, 0]]最佳实践总结明确意图数据不需要修改时优先使用元组自文档化性能敏感大量只读数据使用元组内存占用更小类型提示使用类型注解明确预期类型fromtypingimportList,Tupledefprocess_data(items:List[int])-Tuple[int,int]:returnmin(items),max(items)# 返回元组字典键需要复合键时使用元组而非列表解包友好元组常用于固定数量的返回值总结场景选择原因数据会变化列表支持动态操作数据固定不变元组性能更好可哈希意图明确需要作为字典键元组列表不可哈希函数返回多个值元组Python 默认行为解包方便数据量大且只读元组内存占用更小访问更快记住一句话默认用元组需要修改时用列表。这会让你的代码更安全、更高效、更易读。