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 |
不可变 | 可哈希 | 不支持 |
本文作者:清澈的澈
本文链接:https://www.cnblogs.com/lmc7/p/18642427
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步