python中的可不可变,可不可哈希,可不可修改
在 Python 中,可不可变性、可不可哈希性、以及是否支持修改是理解数据类型行为的关键。以下是对这些特性的详细分析,包括定义、例子和它们之间的联系。
1. 可变性 vs 不可变性
定义
- 可变性:可变类型的数据可以直接修改,而不会改变其引用(内存地址)。
- 不可变性:不可变类型的数据在创建后无法直接修改,任何“修改”操作都会创建一个新对象,改变其引用(内存地址)。
特性对比
| 特性 | 可变类型 | 不可变类型 |
|---|---|---|
| 修改内容 | 支持修改,内存地址不变 | 不支持直接修改,修改会生成新对象 |
| 性能 | 较慢(涉及到原地修改操作) | 较快(不需要考虑原地修改问题) |
| 线程安全 | 不安全(多线程中可能被修改) | 安全(无法修改,线程独立性好) |
常见数据类型分类
| 可变类型 | 不可变类型 |
|---|---|
list(列表) |
int(整数) |
dict(字典) |
float(浮点数) |
set(集合) |
str(字符串) |
bytearray(字节数组) |
tuple(元组) |
| 自定义类(大多可变) | frozenset(冻结集合) |
bytes(字节序列) |
例子
-
可变类型:列表
lst = [1, 2, 3] print(id(lst)) # 查看内存地址 lst.append(4) print(id(lst)) # 内存地址未变 print(lst) # [1, 2, 3, 4] -
不可变类型:字符串
s = "hello" print(id(s)) # 查看内存地址 s += " world" # 修改后生成新对象 print(id(s)) # 内存地址改变 print(s) # "hello world"
2. 可哈希性 vs 不可哈希性
定义
- 可哈希性:一个对象是否可以生成一个固定的哈希值(通过
hash()函数计算)。可哈希对象可以用作字典的键或者存入集合。 - 不可哈希性:对象无法生成固定哈希值,因此不能作为字典的键或存入集合。
特性对比
| 特性 | 可哈希对象 | 不可哈希对象 |
|---|---|---|
| 可变性 | 通常是不可变类型 | 通常是可变类型 |
| 哈希值 | 哈希值固定(__hash__方法) |
无法生成固定哈希值 |
| 使用场景 | 可作为字典键或集合元素 | 不可用作字典键或集合元素 |
常见数据类型分类
| 可哈希类型 | 不可哈希类型 |
|---|---|
int, float, bool |
list(列表) |
str, bytes |
dict(字典) |
tuple(所有元素可哈希时) |
set(集合) |
frozenset |
bytearray(字节数组) |
NoneType(如 None) |
自定义类(默认不可哈希) |
例子
-
可哈希对象
t = (1, 2, 3) print(hash(t)) # 元组是可哈希的 d = {t: "value"} # 元组作为字典键 print(d) -
不可哈希对象
lst = [1, 2, 3] # print(hash(lst)) # 会报错:TypeError: unhashable type: 'list' s = {lst} # 报错,列表不可存入集合
3. 是否支持修改
定义
- 支持修改:类型的内容可以直接增删改,操作后对象引用不变(通常是可变类型)。
- 不支持修改:类型的内容一旦创建不可更改(通常是不可变类型)。
特性对比
| 特性 | 支持修改 | 不支持修改 |
|---|---|---|
| 修改操作 | 增删改操作直接修改原对象 | 任何修改操作生成新对象 |
| 内存地址 | 修改后地址不变 | 修改后地址发生变化 |
常见数据类型分类
| 支持修改类型 | 不支持修改类型 |
|---|---|
list(列表) |
str(字符串) |
dict(字典) |
tuple(元组) |
set(集合) |
frozenset(冻结集合) |
bytearray(字节数组) |
bytes(字节序列) |
例子
-
支持修改
d = {"key": "value"} print(id(d)) # 查看字典地址 d["new_key"] = "new_value" print(id(d)) # 地址不变 print(d) # {"key": "value", "new_key": "new_value"} -
不支持修改
t = (1, 2, 3) # t[0] = 0 # 会报错:TypeError: 'tuple' object does not support item assignment
三者之间的联系
-
可变性与可哈希性
- 通常 可变类型是不可哈希的,因为它们的值可能改变,哈希值会失效。
- 例如,列表是可变的,所以不可哈希;而元组是不可变的,所以可哈希(前提是元素也可哈希)。
-
是否支持修改与可变性
- 可变类型:通常支持修改。
- 不可变类型:不支持修改。
-
不可变类型可哈希
- 大多数不可变类型是可哈希的,例如
int,float,str,tuple。
- 大多数不可变类型是可哈希的,例如
总结
| 特性 | 可变性 | 可哈希性 | 是否支持修改 |
|---|---|---|---|
list |
可变 | 不可哈希 | 支持 |
tuple |
不可变 | 可哈希(元素可哈希) | 不支持 |
dict |
可变 | 不可哈希 | 支持 |
set |
可变 | 不可哈希 | 支持 |
frozenset |
不可变 | 可哈希 | 不支持 |
str |
不可变 | 可哈希 | 不支持 |

浙公网安备 33010602011771号