你想聚焦了解按「数据可变性」划分的 Python 变量类型这是 Python 中非常核心的基础概念我会把这部分内容讲得更聚焦、更易懂帮你彻底理清。核心分类可变变量 vs 不可变变量数据可变性的核心判断标准是变量指向的内存地址中的数据能否被「原地修改」。不可变修改时会创建新的内存地址变量指向新地址原地址数据不变可变修改时不改变内存地址直接修改原地址的数据一、不可变变量Immutable这类变量的核心特征是一旦创建其内部的值就无法在原有内存地址上被修改。如果 “修改”本质是创建了一个新的对象变量名重新指向这个新对象。表格类型示例关键说明int整数a 10; a 20看似修改实际 a 指向了新的整数对象 20float浮点数b 3.14; b 3.1415同上浮点数不可原地修改str字符串s hello; s world字符串拼接会生成新字符串原字符串不变tuple元组t (1, 2); t (1, 2, 3)元组本身不可变重新赋值是指向新元组bool布尔flag True; flag False布尔值只有 True/False修改即指向新对象frozenset不可变集合fs frozenset({1,2}); fs.add(3)报错不可变集合无法添加 / 删除元素代码示例直观理解内存地址变化python运行# 整数不可变 a 10 print(f修改前地址{id(a)}) # 输出一个固定的内存地址 a 20 print(f修改后地址{id(a)}) # 地址变了说明是新对象 # 字符串不可变 s hello print(f修改前地址{id(s)}) s s world print(f修改后地址{id(s)}) # 地址变了 # 元组不可变即使包含可变元素元组本身也不可变 t (1, [2, 3]) # t[0] 100 # 报错元组元素不可修改 t[1].append(4) # 元组内的列表可变可以改但元组本身的结构不变 print(t) # (1, [2, 3, 4]) print(f元组地址{id(t)}) # 地址仍不变二、可变变量Mutable这类变量的核心特征是可以在不改变内存地址的前提下直接修改内部的数据增删改查。表格类型示例关键说明list列表lst [1,2]; lst.append(3)原地添加元素列表地址不变dict字典dic {name:张三}; dic[age]20原地新增键值对字典地址不变set集合s {1,2}; s.add(3)原地添加元素集合地址不变代码示例验证内存地址不变python运行# 列表可变 lst [1, 2, 3] print(f修改前地址{id(lst)}) lst.append(4) # 原地修改 lst[0] 100 # 原地修改元素 print(lst) # [100, 2, 3, 4] print(f修改后地址{id(lst)}) # 地址不变 # 字典可变 dic {name: 张三} print(f修改前地址{id(dic)}) dic[age] 20 # 原地新增 dic[name] 李四 # 原地修改值 print(dic) # {name:李四, age:20} print(f修改后地址{id(dic)}) # 地址不变 # 集合可变 s {1, 2, 3} print(f修改前地址{id(s)}) s.remove(2) # 原地删除 s.add(4) # 原地添加 print(s) # {1, 3, 4} print(f修改后地址{id(s)}) # 地址不变实用小技巧如何判断变量是否可变可以用id()函数查看变量的内存地址修改数据后再查一次地址变了 → 不可变类型地址不变 → 可变类型总结不可变变量int、float、str、tuple、bool、frozenset核心是「不能原地修改修改即新建对象」。可变变量list、dict、set核心是「可原地修改内存地址不变」。关键易错点元组本身不可变但如果元组内包含列表、字典等可变元素这些元素可以被修改元组的 “不可变” 仅指其元素的位置和类型不可改。掌握可变性的核心区别能帮你理解 Python 的内存管理、函数传参值传递 / 引用传递等进阶知识点避免后续踩坑。