Python内置容器类型深度解析(列表/元组/字典/集合/切片/列表推导式/生成器表达式·面试真题)

列表、元组、字典和集合是 Python 里最高频的数据结构,是否可变、是否有序、是否可重复,决定了它们的使用边界。

Python 四大核心内置容器类型:列表、元组、字典、集合,是日常开发**使用率100%**的数据结构。绝大多数业务数据存储、数据去重、数据筛选、参数组装、结果聚合全部依赖容器类型。

本文全覆盖指定知识点:四大容器特性、通用切片语法、列表推导式、生成器表达式。全程搭配可运行代码、底层原理拆解、高频踩坑点、面试真题,是Python进阶、刷题、项目开发的核心基础笔记。

一、四大内置容器总览

Python 内置四大高频容器,根据是否可变、是否有序、是否可重复、是否键值对区分使用场景:

1、列表 list:有序、可变、可重复,最通用容器;

2、元组 tuple:有序、不可变、可重复,只读安全数据;

3、字典 dict:3.7+有序、可变、键唯一,键值对存储;

4、集合 set:无序、可变、元素唯一,主打去重、交集差集。

二、列表 List(最常用可变容器)

列表是有序可变序列,支持增删改查、嵌套、动态扩容,适合存储频繁修改的一组数据。

2.1 基础定义与常用操作

# 列表定义
lst = [1, 2, 3, "python", True]

# 增
lst.append(666)         # 尾部追加
lst.insert(0, 999)       # 指定位置插入
lst.extend([10,20])      # 迭代扩展

# 删
lst.pop()                # 默认删除尾部,返回删除值
lst.pop(0)               # 删除指定索引
lst.remove("python")     # 根据元素删除首个匹配项
# lst.clear()           # 清空列表

# 改
lst[0] = 888

# 查
print(lst[0])            # 索引取值
print(len(lst))          # 列表长度
print(888 in lst)        # 成员判断

2.2 核心特性与工程坑点

特性:有序存储、元素类型任意、支持重复、动态扩容、可变对象。

高频坑点

1、列表属于可变类型,赋值操作是浅拷贝引用传递,修改新列表会影响原列表;

2、循环遍历列表时直接删除元素,会导致索引错乱、漏删元素;

3、频繁中间插入/删除效率低,底层动态数组,中间操作需迁移内存。

三、元组 Tuple(只读不可变容器)

元组是有序不可变序列,定义后无法增删改,数据安全、内存占用小、可作为字典的键。

3.1 基础定义与特性

# 元组定义
t1 = (1, 2, 3, "python")
t2 = (999,)       # 单个元素必须加逗号,否则识别为普通括号

# 只读操作:仅查询,无法修改
print(t1[0])
print(len(t1))
print(2 in t1)

# 元组拼接(生成新元组)
t3 = t1 + t2
print(t3)

3.2 特殊坑点:元组嵌套可变对象

# 元组本身不可变,但内部嵌套列表可修改
t = (1, 2, [3, 4])
# t[0] = 999  # 报错!元组元素不可替换
t[2].append(5) # 合法!内部列表可变
print(t)  # (1, 2, [3, 4, 5])

原理:元组不可变指的是元素引用地址不可变,不限制引用对象内部修改。

3.3 使用场景

1、固定配置数据、防止程序意外修改;

2、作为字典key、集合元素(不可变类型可哈希);

3、函数多返回值默认元组返回,节省内存。

四、字典 Dict(键值对存储)

字典是 Python 哈希表结构,3.7版本后默认有序,key唯一、查询速度极快,适合映射关系存储。

4.1 基础增删改查

# 字典定义
dic = {"name": "python", "age": 20, "level": "high"}

# 查
print(dic["name"])                # 直接取值,无key报错
print(dic.get("sex", "未知"))     # get取值,无key不报错,支持默认值

# 增/改
dic["sex"] = "男"                 # 无则新增,有则覆盖

# 删
dic.pop("level")                  # 删除指定key
# dic.clear()                    # 清空字典

# 遍历
print(dic.keys())                 # 所有键
print(dic.values())               # 所有值
print(dic.items())                # 所有键值对

4.2 核心约束与坑点

1、字典 key 必须是不可变类型(数字、字符串、元组),列表/集合不能做key;

2、key 唯一,重复赋值会覆盖旧值;

3、哈希表查询时间复杂度 O(1),远快于列表遍历查询;

4、遍历字典时新增/删除键值对会触发异常。

五、集合 Set(去重与集合运算)

集合是无序、元素唯一、可变容器,底层同样是哈希表,核心能力:自动去重、交集、并集、差集运算。

5.1 基础用法与去重

# 集合定义
s = {1, 2, 2, 3, 3, 4}
print(s)  # 自动去重 {1,2,3,4}

# 空集合必须用 set(),{}是空字典
empty_set = set()

# 增删
s.add(5)
s.remove(1)
s.discard(999)  # 不存在不报错

# 集合运算
s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 & s2)   # 交集 {3}
print(s1 | s2)   # 并集 {1,2,3,4,5}
print(s1 - s2)   # 差集 {1,2}

5.2 核心坑点

1、集合元素必须是可哈希不可变类型,列表、字典无法存入集合;

2、无序结构,不支持索引取值、切片;

3、主要用于数据去重、关系比对,不适合存储有序业务数据。

六、切片语法(序列通用技能)

切片是 Python 列表、元组、字符串通用的取值语法,用于批量截取序列数据,格式:seq[start:end:step]

6.1 切片完整规则

1、start:起始索引,默认0;

2、end:结束索引,左闭右开,默认末尾;

3、step:步长,默认1,支持正负,负数代表倒序截取。

6.2 实战案例

lst = [0, 1, 2, 3, 4, 5, 6]

print(lst[1:4])      # [1,2,3] 截取1~4左闭右开
print(lst[:3])       # 从头截取到索引3
print(lst[3:])       # 索引3截取到末尾
print(lst[::2])      # 步长2,隔一取一
print(lst[::-1])     # 切片反转(经典用法)
print(lst[-3:])      # 倒数三个元素

6.3 切片核心特性

1、切片取值不会越界报错,超出范围自动截断;

2、切片会生成新对象,修改切片结果不会影响原序列;

3、仅支持有序序列:字符串、列表、元组,字典、集合不支持切片。

七、列表推导式(高效生成列表)

列表推导式是 Python 极简高效语法,一行代码替代多层for循环,快速生成、筛选列表,可读性高、执行速度快。

7.1 基础语法与实战

# 基础格式:[表达式 for 变量 in 序列]
# 1、快速生成1-10列表
lst1 = [i for i in range(1, 11)]
print(lst1)

# 2、带条件筛选:1-10偶数
lst2 = [i for i in range(1, 11) if i % 2 == 0]
print(lst2)

# 3、表达式加工:数值平方
lst3 = [i**2 for i in range(1, 6)]
print(lst3)

# 4、双层循环推导
lst4 = [f"{a}{b}" for a in "ABC" for b in "123"]
print(lst4)

7.2 优缺点与规范

优点:代码简洁、底层C级循环、效率高于手动for追加。

缺点:逻辑过于复杂时可读性变差,不支持多层复杂逻辑。

规范:简单筛选、变换优先推导式,复杂逻辑使用普通循环。

八、生成器表达式(海量数据最优解)

生成器表达式语法和列表推导式几乎一致,将 [] 改为 (),不一次性生成全部数据,而是迭代时按需生成,极致节省内存。

8.1 基础对比实战

# 列表推导式:一次性加载所有数据到内存
lst = [i for i in range(100000)]

# 生成器表达式:仅创建迭代对象,不占用内存
gen = (i for i in range(100000))

# 遍历取值
for num in gen:
    if num > 10:
        break
    print(num)

8.2 核心特性与区别

1、内存差异:列表推导式一次性加载全部数据,海量数据会内存溢出;生成器惰性求值,永久只占用极小内存;

2、取值差异:列表可任意索引、重复取值;生成器单向迭代、取完即空,不支持索引;

3、速度差异:小数据量列表更快,大数据量生成器碾压。

8.3 适用场景

1、超大文件读取、海量数据遍历;

2、流式数据处理、逐条消费场景;

3、只需遍历、无需索引重复取值的场景。

九、高频面试真题汇总

题目1:列表、元组、字典、集合的区别?

答案:列表有序可变可重复;元组有序不可变可重复;字典键值对、键唯一、3.7+有序;集合无序、元素唯一、自动去重,用于集合运算。

题目2:元组不可变为什么内部列表可以修改?

答案:元组不可变是元素引用地址不可变,内部列表地址未变,仅列表自身内容修改,不违反元组规则。

题目3:列表推导式和生成器表达式区别?

答案:列表推导式[]一次性生成全部数据,内存占用大、支持索引重复取值;生成器()惰性迭代、按需生成、极致省内存、单向迭代取完即空。

题目4:哪些类型可以作为字典key、集合元素?

答案:必须是不可变可哈希类型:数字、字符串、元组;列表、字典、集合可变不可哈希,无法使用。

十、全文终极背诵总结

1、列表list:万能可变有序容器,支持增删改查,适合频繁修改数据;

2、元组tuple:只读有序容器,数据安全、可哈希,嵌套可变对象内部可修改;

3、字典dict:哈希键值对,查询极速,key唯一且必须不可变;

4、集合set:无序唯一,主打去重、交集并集差集运算,无索引;

5、切片:序列通用截取规则,左闭右开、支持正负步长、不越界报错;

6、列表推导式:一行生成筛选列表,简洁高效,适合小数据量快速构造;

7、生成器表达式:惰性求值,省内存,海量数据遍历场景首选。

本文总结

  • 列表适合动态序列,元组适合不可变记录,字典适合键值映射,集合适合去重和集合运算。
  • 切片语法是序列处理的基础能力,要同时理解起止边界、步长和负索引。
  • 列表推导式立即生成列表,生成器表达式惰性产出数据,二者在内存占用上差异明显。
GYSTACK 文章文末广告 硅云云服务器活动 适合个人项目、轻量建站和出海业务部署。
后浪云移动端信息流广告 后浪云主机服务 适合长期部署、独立站和海外机房需求。