0

0

Python可变与不可变类型_数据类型设计思路解析

舞姬之光

舞姬之光

发布时间:2026-03-05 17:52:03

|

482人浏览过

|

来源于php中文网

原创

python中数据类型分为可变(如list、dict)与不可变(如int、str、tuple)两类:可变类型支持原地修改且id不变,不可变类型任何“修改”均生成新对象并改变id。

python可变与不可变类型_数据类型设计思路解析

Python中的数据类型被明确划分为可变类型与不可变类型,这一划分直接影响对象在内存中的行为表现,尤其是赋值、函数传参和身份比较等操作的结果。以下是针对该分类机制的设计逻辑与典型表现的解析:

一、可变类型的核心特征与实例

可变类型指对象创建后其内容可以被修改而不改变对象的身份(即id不变)。这种设计支持原地更新,节省内存并提升频繁修改场景下的效率。Python中典型的可变类型包括list、dict、set以及自定义的类实例(默认情况下)。

1、定义一个列表:a = [1, 2, 3]

2、获取其初始id:print(id(a))

立即学习Python免费学习笔记(深入)”;

3、对列表进行原地修改:a.append(4)

4、再次打印id:print(id(a)),输出结果与步骤2完全相同

5、验证修改生效:print(a) 输出 [1, 2, 3, 4]

此时对象a的内存地址未变化,但内容已扩展,体现了可变类型的本质特性。

二、不可变类型的核心特征与实例

不可变类型指对象一旦创建,其值就不能被更改;任何看似“修改”的操作都会生成新对象。这种设计保障了数据一致性与线程安全性,也使不可变对象可作为字典键或集合元素使用。Python中典型的不可变类型包括int、float、str、tuple、frozenset。

1、定义一个字符串:s = "hello"

2、获取其初始id:print(id(s))

3、执行字符串拼接:s = s + " world"

4、再次打印id:print(id(s)),输出结果与步骤2完全不同

5、验证内容变化:print(s) 输出 "hello world"

此时原始字符串对象已被丢弃,变量s指向一个全新创建的字符串对象,这是不可变类型的关键表现。

三、可变与不可变在赋值操作中的差异

赋值操作(=)在Python中始终是对象引用的绑定,不复制对象本身。但由于可变与不可变类型的内在行为不同,赋值后的后续操作会产生截然不同的效果。

1、对不可变类型赋值:x = 10;y = x;此时x与y指向同一整数对象

Axiom
Axiom

Axiom是一个浏览器扩展,用于自动化重复任务和web抓取。

下载

2、修改y:y = y + 1;此时y指向新整数对象21,x仍为10且id不变

3、对可变类型赋值:m = [1, 2];n = m;此时m与n指向同一列表对象

4、修改n:n.append(3);此时m也变为[1, 2, 3],因为二者共享同一底层对象

关键区别在于:对不可变对象的“修改”必然导致新对象产生,而对可变对象的修改则直接作用于原对象

四、函数参数传递中的体现

Python中所有参数传递均为“对象引用传递”,但可变与不可变类型在此机制下展现出不同可观测行为,这源于对象自身是否允许就地修改。

1、定义函数def modify_list(lst): lst.append('new')

2、调用前:my_list = ['a', 'b'];modify_list(my_list)

3、调用后:print(my_list) 输出 ['a', 'b', 'new'],原列表被改变

4、定义函数def modify_str(s): s += 'X'

5、调用前:text = 'abc';modify_str(text)

6、调用后:print(text) 仍输出 'abc',原始字符串未变

原因在于:函数内对可变对象的方法调用(如append)作用于原对象,而对不可变对象的运算(如+=)生成新对象且局部变量仅绑定新对象

五、身份比较与相等比较的关联性

is运算符比较对象身份(即内存地址),==比较对象值。可变与不可变类型在小整数、短字符串等特定范围内存在对象复用机制,影响is的结果,但该机制不改变类型本身的可变性定义。

1、测试小整数:a = 5;b = 5;print(a is b) 输出True(CPython小整数池优化)

2、测试大整数:c = 1000;d = 1000;print(c is d) 输出False(通常情况,非保证)

3、测试字符串:e = "hello";f = "hello";print(e is f) 在交互式环境常为True(驻留机制)

4、强制新建字符串:g = "hello" + "";h = "hello";print(g is h) 可能为False

需注意:is结果受实现细节(如CPython的驻留与小整数缓存)影响,不能用于判断可变性;可变性由类型定义决定,与对象是否被复用无关

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

594

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号