Python数据类型-可变和不可变对象
2025-8-31
| 2025-8-31
Words 793Read Time 2 min
type
status
date
slug
summary
tags
category
icon
password
😀
在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 变量:存储对象的引用 对象:会被分配一块内存,存储实际的数据,比如字符串、数字、列表 引用:变量指向对象,可以理解为指针

📝 定义速记

分类
白话描述
举例
不可变对象
创建后 内容不可改;任何“修改”都会产生 新对象
int, float, str, tuple, frozenset
可变对象
创建后 内容可原地改;对象 id 保持不变
list, dict, set, bytearray, 自定义类实例 …

📝 常见内置类型对照表

类型
可变?
是否可哈希(默认)
说明
int
任意精度整数
float
IEEE-754 双精度
complex
复数
str
Unicode 字符串
tuple
✅(元素可哈希时)
不可变序列
frozenset
不可变集合
range
惰性整数序列
list
可变序列
dict
键值映射
set
哈希集合
bytearray
可变字节数组
自定义类
默认 ✅
默认 ✅
通过 __hash__/__eq__ 控制

📝 底层实现差异

1、不可变对象

CPython 内部把 小整数 (-5~256)、短 str 做 intern(全局缓存),多次创建指向 同一内存。
任何“修改”都会触发 重新分配内存 与 复制内容,因此旧对象 绝对不可变。

2、可变对象

采用 动态数组(list)、哈希表(dict/set)、可变缓冲区(bytearray)。
原地修改时仅 调整内部结构,对象地址不变,减少了内存分配与拷贝。

📝 可哈希性(Hashable)与字典/set 的关系

只有 不可变且实现 \\hash\\ 与 \\eq\\ 的对象才可作为 dict 键或 set 元素。

📝 函数参数传递行为

“对象引用” 传递,但 可变/不可变差异 体现在 能否在原对象上修改:
类型
函数内修改
对外部影响
int/str/tuple
重新绑定新对象
不影响外部
list/dict/set
原地修改元素
影响外部

📝 性能与并发安全

1、不可变对象

线程安全(无共享写),可放心在多线程环境传递。
大量小对象会触发 内存池 + intern,降低 GC 压力。

2、可变对象

需要 锁 或 不可变副本 保证线程安全。
原地修改避免重复分配,CPU 缓存友好,适合高频写场景。
 
 
 
  • 开发
  • Python
  • Python数据类型-基础数据类型-映射类型 --- dictPython函数-函数基础
    Loading...