Python 对象的分类体系

发布时间:2026/6/30 1:14:11
Python 对象的分类体系 一、对象的三大分类维度Python 中的对象可以从三个维度来分类它们互不冲突一个对象可以同时属于多个类别维度含义判断标准是否可变对象创建后内容能否被修改hash(obj)可哈希 不可变不可哈希 可变是否序列对象是否有顺序能否用下标索引访问支持obj[0]即索引操作是否可迭代对象能否被for...in循环遍历支持iter(obj)返回迭代器二、常见类型三维度对照表核心类型是否可变是否序列是否可迭代归类列表list✅ 可变✅ 序列✅ 可迭代可变序列字典dict✅ 可变❌ 非序列无序键值对✅ 可迭代可变非序列集合set✅ 可变❌ 非序列无序✅ 可迭代可变非序列字符串str❌ 不可变✅ 序列✅ 可迭代不可变序列元组tuple❌ 不可变✅ 序列✅ 可迭代不可变序列整数int❌ 不可变❌ 非序列❌ 不可迭代不可变非序列浮点数float❌ 不可变❌ 非序列❌ 不可迭代不可变非序列range❌ 不可变✅ 序列✅ 可迭代不可变序列文件对象部分可变❌ 非序列✅ 可迭代可变非序列三、图解关系所有 Python 对象 │ ┌───────────────┴───────────────┐ │ │ 可变对象 不可变对象 (内容可修改) (内容不可修改) │ │ ┌─────┴─────┐ ┌──────┴──────┐ │ │ │ │ 序列 非序列 序列 非序列 (有顺序) (无顺序) (有顺序) (无顺序) │ │ │ │ 列表 集合/字典 字符串/元组/range int/float/布尔 (可变序列) (可变非序列) (不可变序列) (不可变非序列) ✅可迭代 ✅可迭代 ✅可迭代 ❌不可迭代四、常见坑点汇总全是易错点坑 1元组(1, 2, 3)和字符串abc都不可变但都可迭代t (1, 2, 3) t[0] 10 # ❌ 报错 TypeError不可变 for i in t: print(i) # ✅ 可以遍历可迭代坑 2字符串有下标索引属于序列但不可变s hello s[0] H # ❌ 报错 TypeError不可变 s[0] # ✅ h序列 for c in s: # ✅ 可迭代 print(c)坑 3集合和字典都可变、可迭代但不是序列无序无下标s {1, 2, 3} s.add(4) # ✅ 可变 s[0] # ❌ 报错 TypeError非序列 for i in s: # ✅ 可迭代 print(i)坑 4元组的陷阱单元素元组必须有逗号x (test) # 这是字符串 str不是元组 x (test,) # 这才是元组 tuple坑 5函数参数的传值 vs 传引用传入对象类型函数内部修改外部是否改变不可变对象int/str/tuple创建新对象原对象不变❌ 不变可变对象list/dict/set修改内部元素不改赋值✅ 改变不变def change(lst): lst.append(new) # 修改原对象 → 外部改变 lst [1, 2, 3] # 重新赋值 → 外部不变但极少这样写 x [test] change(x) print(x) # [test, new]因为执行了 append没执行重新赋值lst是局部变量最初指向x指向的同一个列表。执行lst.append(new)时修改的是该列表对象。执行lst [1, 2, 3]时lst断开与原对象的连接指向新创建的列表。但x仍然指向原来的列表。变方法一直接修改原对象推荐不清除原列表而是修改原列表的内容def change(lst): lst.clear() # 清空原列表 lst.extend([1, 2, 3]) # 填充新内容 x [test] change(x) print(x) # [1, 2, 3]方法二返回新列表并重新赋值让函数返回新列表外部接收返回值def change(lst): return [1, 2, 3] # 返回新列表 x [test] x change(x) print(x) # [1, 2, 3]方法四删除原引用让函数操作全局变量不推荐使用global关键字但会破坏封装性def change(): global x x [1, 2, 3] x [test] change() print(x) # [1, 2, 3]