Python中不可变与可变数据类型的内存机制解析
本文深入解析Python中不可变与可变数据类型的核心区别,重点阐述内存地址变化规律。整型、字符串、元组属于不可变类型,修改值时内存地址改变;列表、集合、字典为可变类型,修改内容时内存地址保持不变。特别解析元组包含可变对象时的特殊行为,以及Python 3.6后字典有序性的新特征,帮助开发者理解底层存储机制。
前言
Python与C/C++在变量使用上存在显著差异,其核心设计理念是“一切皆为对象,一切皆为对象的引用”。这一特性与Java相似,因此开发者无需像处理C/C++指针那样担心复杂的内存管理问题。在Python中,数据被明确划分为可变数据类型和不可变数据类型两大类。
因此,在Python学习过程中,理解不可变与可变数据类型的区别至关重要。以下将详细介绍这两类数据的具体表现。
1.名词解释
以下所有分析均基于内存地址的变化进行说明。
- 不可变数据类型:当变量的值发生改变时,其对应的内存地址也会随之改变。这类数据类型被称为不可变数据类型。
- 可变数据类型:当变量的值发生改变时,其对应的内存地址保持不变。这类数据类型被称为可变数据类型。
总结:不可变数据类型在修改后内存地址会发生改变,而可变数据类型在修改后内存地址保持不变。
2.数据类型分类
Python中的主要数据类型包括:整型、字符串、元组、集合、列表和字典。接下来将通过具体示例逐一分析它们属于不可变还是可变数据类型。
2.1 整型
a = 1 print(id(a),type(a)) a = 2 print(id(a),type(a)) 1912499232 <class 'int'> 1912499264 <class 'int'>
通过观察代码执行结果可以发现,当整型变量的值发生改变后,其内存地址也发生了改变。因此,整型属于不可变数据类型。
2.2 字符串
b = 'djx' print(id(b),type(b)) b = 'djx1996' print(id(b),type(b)) 535056476344 <class 'str'> 535056476624 <class 'str'>
同样地,当字符串变量的值发生改变后,其内存地址也发生了改变。因此,字符串属于不可变数据类型。
2.3 元组
元组常被称为“只读列表”,即数据可以被查询但不能被直接修改。然而,我们可以在元组元素中存放一个列表,并通过修改该列表的值来测试元组究竟属于可变还是不可变类型。
c1 = ['1','2'] c = (1,2,c1) print(c,id(c),type(c)) c1[1] = 'djx' print(c,id(c),type(c)) result: (1, 2, ['1', '2']) 386030735432 <class 'tuple'> (1, 2, ['1', 'djx']) 386030735432 <class 'tuple'>
实验结果显示,虽然元组内部列表的值发生了改变,但元组本身的内存地址并未改变。但这并不能据此判定元组为可变数据类型。回顾元组的定义,其本质是不可变的。当我们修改元组中列表的值时,由于列表本身是可变数据类型,其内存地址不变,因此列表在元组中的引用地址也未改变。这意味着元组本身的结构并未发生变化,因此我们仍认为元组是不可变数据类型。
2.4 集合
集合常用于去重和关系运算,其特点是无序性。
s = {1,'d','34','1',1}
print(s,type(s),id(s))
s.add('djx')
print(s,type(s),id(s))
result:
{'d', 1, '34', '1'} <class 'set'> 870405285032
{1, '34', 'djx', '1', 'd'} <class 'set'> 870405285032
通过示例可以看出,尽管集合中的数据内容发生了改变,但其内存地址保持不变。因此,集合属于可变数据类型。
2.5 列表
列表是Python的基础数据类型之一,其他语言中类似的结构如JavaScript的数组。列表使用方括号[]括起,元素以逗号分隔,且可以包含各种数据类型。
list = [1,'q','qwer',True]
print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))
result:
[1, 'q', 'qwer', True] <class 'list'> 808140621128
[1, 'q', 'qwer', True, 'djx'] <class 'list'> 808140621128
示例表明,尽管列表中的数据内容发生了改变,但其内存地址保持不变。因此,列表属于可变数据类型。
2.6 字典
字典是Python中唯一的映射类型,采用键值对(key-value)形式存储数据。Python对key进行哈希运算,根据结果决定value的存储地址,因此字典传统上是无序存储的。但在Python 3.6版本之后,字典开始保持插入顺序,这是新版本的特性。
字典的key可以是整型、字符串或元组,但不能是列表、集合或字典。
tuple = (1)
dic = {1:2}
d = { tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4'] = 'haha'
print(d,type(d),id(d))
result:
{1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 256310956320
{1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 256310956320
示例显示,尽管字典中的数据内容发生了改变,但其内存地址保持不变。因此,字典属于可变数据类型。
| 数据类型 | 可变/不可变 |
| 整型 | 不可变 |
| 字符串 | 不可变 |
| 元组 | 不可变 |
| 列表 | 可变 |
| 集合 | 可变 |
| 字典 | 可变 |
总结
以上就是本文的全部内容,希望这些内容对您的学习或工作有所帮助。如有疑问,欢迎留言交流,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













