news 2026/11/2 1:54:45

把数据 “装进柜子“:Python 四大容器一次讲透,再也不纠结该用哪种

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
把数据 “装进柜子“:Python 四大容器一次讲透,再也不纠结该用哪种

前面咱们学了变量 —— 但一个变量只能装一个值。真实程序里数据是一堆一堆的:一筐学生的成绩、一本通讯录、一批订单…… 这时候就需要容器(Container)把数据装起来。

Python 有四种主力容器:列表 list、元组 tuple、字典 dict、集合 set。老哥这篇把它们一次讲透,重点讲清它们的区别 —— 搞懂这个,以后选型不再纠结。

一、先认识 "序列"

列表、元组、字符串都是序列(Sequence)—— 有序、能按下标访问。序列通用操作先记住:

seq[0] # 索引,从0开始,末尾从-1开始 seq[1:3] # 切片,含头不含尾 seq1 + seq2 # 相加 seq * 3 # 乘法(重复) x in seq # 成员检查 len(seq) # 长度 max(seq) min(seq) # 最大/最小

二、列表 List(可变、有序、允许重复)

用[]定义,元素可以不同类型。它是你用最多的容器。

list1 = [100, 200, 300, 400, 500] print(list1[1]) # 200 print(list1[-2]) # 400 print(list1[2:4]) # [300, 400] 切片含头不含尾 print(list1[::-1]) # [500,400,300,200,100] 倒序

增删改查:

list1.append(600) # 末尾追加 list1.insert(2, 700) # 指定位置插入 list1[0] = -1 # 按下标改 list1[2:4] = ["a","b","c"] # 按切片改 del list1[2] # 删除指定位置 100 in list1 # 成员检查 len(list1) # 长度 max(list1) min(list1) sum(list1) # 最大/最小/求和

遍历三种姿势:

for i in list1: # 直接遍历元素 print(i) for i in range(len(list1)): # 按下标遍历 print(i, list1[i]) for i, val in enumerate(list1): # 同时拿下标和元素(最推荐) print(i, val)

列表推导式(Python 精髓,一行生成新列表):

squares = [x**2 for x in range(5)] # [0,1,4,9,16] even_squares = [x**2 for x in range(10) if x % 2 == 0] # 带条件 [0,4,16,36,64] pairs = [(i, j) for i in [1,2] for j in ["a","b"]] # 双重循环

zip()把多个列表对应元素打包成元组:

list1 = [1, 2, 3]; list2 = ["a", "b", "c"] print(list(zip(list1, list2))) # [(1,'a'),(2,'b'),(3,'c')]

三、字符串 String(不可变、有序)

字符串也是序列,但不可变—— 里面的字符不能改。常用函数很实用:

str1 = "hello world" print("lo" in str1) # True print(str1.replace("world", "Python")) # 替换 print(str1.split()) # 按空白分割成列表 print("_".join(["a","b","c"])) # a_b_c join以x为连接符 print(str1.upper()) # HELLO WORLD print(str1.startswith("he")) # True print(str1.find("lo")) # 找到返回下标,找不到返回-1

原始字符串:前面加r,转义字符失效,常用于路径和正则:

print("hello\nworld") # 换行 print(r"hello\nworld") # 原样输出 hello\nworld

四、元组 Tuple(不可变、有序、允许重复)

用()定义,元素不能修改。适合装 "不该变" 的数据(如坐标、日期)。

tuple1 = (100, 200, 300) print(tuple1[2]) # 300 print(len(tuple1)) # 3

两个易错点:

  • 单元素元组要加逗号:(100,),否则(100)只是括号运算;
  • 元组不可变是 "指向的内存内容不可变",但如果元组里嵌套了可变类型(如列表),嵌套项仍可改:
tuple1 = (100, [1, 2, 3]) tuple1[3].append(4) # 元组里的列表可以改

五、集合 Set(可变、无序、不允许重复)

用{}或set()定义,自动去重、没有下标。最适合:去重、快速成员检查、集合运算。

set1 = {1, 2, 2, 3} # {1,2,3} 自动去重 set1.add(4) set1.remove(2) # 不存在会报错 set1.discard(99) # 不存在也不报错

集合运算(这是集合的杀手锏):

a = {1, 2, 3}; b = {2, 3, 4} print(a & b) # 交集 {2,3} print(a | b) # 并集 {1,2,3,4} print(a - b) # 差集 {1} print(a ^ b) # 对称差(不重复的部分){1,4}

⚠️ 注意:创建空集合要用set(),用{}会建出空字典!

六、字典 Dictionary(可变、无序、键唯一)

用{},格式{key: value}。键唯一、键必须不可变(字符串 / 数字 / 元组),值随便。

dict1 = {"name": "Alice", "age": 18} print(dict1["name"]) # Alice print(dict1.get("address")) # 键不存在返回 None(不报错) print(dict1.get("address", "earth")) # 指定默认值 dict1["name"] = "Bob" # 修改 dict1["address"] = "earth" # 新增 "name" in dict1 # 检查键是否存在 len(dict1) # 键值对个数

遍历三种:

for k in dict1.keys(): # 遍历键 for v in dict1.values(): # 遍历值 for k, v in dict1.items(): # 同时遍历键值(最常用)

字典推导式:

squares = {x: x**2 for x in range(4)} # {0:0, 1:1, 2:4, 3:9}

七、一张表记住四种容器怎么选

表格

数据结构可变允许重复有序定义符号
列表 List✅✅✅[]或list()
元组 Tuple❌✅✅()或tuple()
字典 Dict✅键不许 / 值许键无序 (3.7 + 保持插入序){}或dict()
集合 Set✅❌❌{}或set()

老哥收尾

选型口诀送给你:

要改、要排序、要重复 → 用列表;不能改、求固定 → 用元组;要去重、要集合运算 → 用集合;要按名字查值 → 用字典。

下一篇咱们讲函数—— 把重复代码封装起来,是程序变 "模块化" 的第一步。有问题随时回来找老哥。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 1:54:45

国央企班车采购:合规审计与集团多级管理

国央企班车采购:合规审计与集团多级管理 深圳建科院的后勤负责人说过一句话:「建科院曾花费不少时间和精力去寻找市面上能够满足需求的用车供应商,直至找到嘟嘟巴士,才顺利解决所有用车问题。」 听着像客套。放在国企语境里不是。…

作者头像 李华
网站建设 2026/11/2 1:53:18

codefuzzer+bufferfuzzer 将语法引入灰白盒fuzz测试

fuzz测试(模糊测试)一直是非常流行的未知漏洞挖掘方法 模糊测试大概上个世纪80年代就被人提出,到目前为止已经发现了无数个安全漏洞和代码质量问题1.随机fuzz 最早阶段的模糊测试大概就是找到被测目标的数据输入点,对数据进行随机…

作者头像 李华
网站建设 2026/11/2 1:53:02

slub shuffle_freelist

shuffle_freelist() 是 SLUB freelist 随机化机制的建链函数:它利用预先计算好的随机序列 s->random_seq,把一个新 slab 页里的所有对象按随机顺序串成 freelist,使分配顺序不可预测,增加堆溢出攻击的难度。一、函数签名static…

作者头像 李华
网站建设 2026/11/2 1:52:32

Burp Suite安装教程

一共有两个步骤先安装Java环境再安装burp suite通过网盘分享的文件:BurpSuite_Pro_V2026.8.zip 链接: https://pan.baidu.com/s/1qcMCHIw7AN02XBg12MjKaQ?pwdrubt 提取码: rubt先说安装Java配置环境安装java,双击打开jdk。选择安装位置配置Java打开【设…

作者头像 李华
网站建设 2026/11/2 1:51:45

智能家居全国交付中责任闭环架构的设计与实现:到场式交付与兜底式交付的系统差异

一、背景/痛点分析 智能家居全国交付中存在两类交付模式,差异不在执行端能力水平,在服务承诺的终点定义。 到场式交付的承诺终点是执行端到达现场并完成动作。设备安装完成、订单状态标记完成,交付流程即终止。系统不覆盖系统联调、场景验证、…

作者头像 李华