Python 中对象“可变 / 不可变”到底是指什么?

发布时间 - 2026-01-21 00:00:00    点击率:
Python中对象的“可变/不可变”指其内存值能否原地修改:不可变对象(如int、str、tuple)任何修改操作都生成新对象,id()改变;可变对象(如list、dict、set)调用append()等方法后内容变但id()不变。

Python 中对象的“可变 / 不可变”指的是该对象在创建后,其**内存中存储的值能否被原地修改**。不是指变量能不能重新赋值,而是看对象自身的内容是否允许被改变而不新建对象。

关键区别:id() 是否变化

判断一个对象是否可变,最直接的方式是观察对它做“修改操作”后,id()(即内存地址)是否改变:

  • 不可变对象(如 intstrtuple):任何看似“修改”的操作(比如 s += "x"i += 1)都会创建新对象,原对象不变,id() 一定不同;
  • 可变对象(如 listdictset):调用 .appen

    d()
    .update().add() 等方法后,内容变了,但 id() 保持不变——它是同一个对象,只是内部状态被更新了。

常见误区:变量名 ≠ 对象

很多人混淆“给变量重新赋值”和“修改对象本身”。例如:

a = [1, 2]
a = [3, 4]  # 这不是修改列表,而是让 a 指向一个新列表

这跟可变性无关——无论对象可不可变,变量都能重新绑定。真正体现可变性的操作是:不改变变量名绑定关系,却改变了它所指对象的内容。比如:

lst = [1, 2]
lst.append(3)  # lst 仍指向原对象,但内容变成 [1, 2, 3],id(lst) 不变

为什么设计成这样?影响在哪?

不可变性带来安全性与一致性:

  • strtuple 可作字典键或集合元素,因为它们哈希值稳定;
  • 函数默认参数若用可变对象(如 def f(x=[])),多次调用会共享同一列表,导致意外累积——这是典型因忽略可变性引发的 bug;
  • 传参时,可变对象在函数内被修改,会影响外部原始对象(所谓“传对象引用”,效果类似传指针);不可变对象则不会,因为任何“修改”都生成新对象。

如何快速查某个类型是否可变?

没有绝对的“查文档才知”,但有实用经验:

  • 内置原子类型基本都不可变:intfloatboolstrbytesNoneTypetuple(注意:tuple 内部可以含可变对象,但 tuple 本身结构不可变);
  • 容器类若提供原地修改方法(.append().clear().pop() 等),大概率可变:listdictsetbytearray
  • 自定义类默认可变(除非手动冻结,如用 @dataclass(frozen=True) 或限制 __slots__ 并禁写逻辑)。


# python  # app  # 区别  # 为什么 


相关栏目: 【 网站优化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?(安装配置)