Python 中对象“可变 / 不可变”到底是指什么?
发布时间 - 2026-01-21 00:00:00 点击率:次Python中对象的“可变/不可变”指其内存值能否原地修改:不可变对象(如int、str、tuple)任何修改操作都生成新对象,id()改变;可变对象(如list、dict、set)调用append()等方法后内容变但id()不变。
Python 中对象的“可变 / 不可变”指的是该对象在创建后,其**内存中存储的值能否被原地修改**。不是指变量能不能重新赋值,而是看对象自身的内容是否允许被改变而不新建对象。
关键区别:id() 是否变化
判断一个对象是否可变,最直接的方式是观察对它做“修改操作”后,id()(即内存地址)是否改变:
- 不可变对象(如 int、str、tuple):任何看似“修改”的操作(比如
s += "x"或i += 1)都会创建新对象,原对象不变,id()一定不同; - 可变对象(如 list、dict、set):调用
.appen、
d()
.update()、.add()等方法后,内容变了,但id()保持不变——它是同一个对象,只是内部状态被更新了。
常见误区:变量名 ≠ 对象
很多人混淆“给变量重新赋值”和“修改对象本身”。例如:
a = [1, 2] a = [3, 4] # 这不是修改列表,而是让 a 指向一个新列表
这跟可变性无关——无论对象可不可变,变量都能重新绑定。真正体现可变性的操作是:不改变变量名绑定关系,却改变了它所指对象的内容。比如:
lst = [1, 2] lst.append(3) # lst 仍指向原对象,但内容变成 [1, 2, 3],id(lst) 不变
为什么设计成这样?影响在哪?
不可变性带来安全性与一致性:
- str 和 tuple 可作字典键或集合元素,因为它们哈希值稳定;
- 函数默认参数若用可变对象(如
def f(x=[])),多次调用会共享同一列表,导致意外累积——这是典型因忽略可变性引发的 bug; - 传参时,可变对象在函数内被修改,会影响外部原始对象(所谓“传对象引用”,效果类似传指针);不可变对象则不会,因为任何“修改”都生成新对象。
如何快速查某个类型是否可变?
没有绝对的“查文档才知”,但有实用经验:
- 内置原子类型基本都不可变:
int、float、bool、str、bytes、NoneType、tuple(注意:tuple 内部可以含可变对象,但 tuple 本身结构不可变); - 容器类若提供原地修改方法(
.append()、.clear()、.pop()等),大概率可变:list、dict、set、bytearray; - 自定义类默认可变(除非手动冻结,如用
@dataclass(frozen=True)或限制__slots__并禁写逻辑)。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站页面设计需要考虑到这些问题
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何使用Collections进行数据处理?(实用方法示例)
如何在阿里云完成域名注册与建站?
北京网站制作公司哪家好一点,北京租房网站有哪些?
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
详解Android——蓝牙技术 带你实现终端间数据传输
EditPlus 正则表达式 实战(3)
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Python进程池调度策略_任务分发说明【指导】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何撰写建站申请书?关键要点有哪些?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Bootstrap整体框架之JavaScript插件架构
教你用AI将一段旋律扩展成一首完整的曲子
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
在Oracle关闭情况下如何修改spfile的参数
如何挑选高效建站主机与优质域名?
如何快速登录WAP自助建站平台?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
🚀拖拽式CMS建站能否实现高效与个性化并存?
如何在Windows虚拟主机上快速搭建网站?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
如何获取上海专业网站定制建站电话?
昵图网官方站入口 昵图网素材图库官网入口
做企业网站制作流程,企业网站制作基本流程有哪些?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel如何配置Horizon来管理队列?(安装和使用)
C++时间戳转换成日期时间的步骤和示例代码
如何快速搭建安全的FTP站点?
Python高阶函数应用_函数作为参数说明【指导】
iOS验证手机号的正则表达式
javascript中闭包概念与用法深入理解
详解Android中Activity的四大启动模式实验简述
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
详解jQuery中的事件
Java解压缩zip - 解压缩多个文件或文件夹实例
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Swift中swift中的switch 语句
进行网站优化必须要坚持的四大原则
如何用PHP快速搭建CMS系统?
Laravel如何集成Inertia.js与Vue/React?(安装配置)


