2024-12-30 20:59阅读: 55评论: 0推荐: 0

python中的可不可变,可不可哈希,可不可修改

在 Python 中,可不可变性可不可哈希性、以及是否支持修改是理解数据类型行为的关键。以下是对这些特性的详细分析,包括定义、例子和它们之间的联系。


1. 可变性 vs 不可变性

定义

  • 可变性:可变类型的数据可以直接修改,而不会改变其引用(内存地址)。
  • 不可变性:不可变类型的数据在创建后无法直接修改,任何“修改”操作都会创建一个新对象,改变其引用(内存地址)。

特性对比

特性 可变类型 不可变类型
修改内容 支持修改,内存地址不变 不支持直接修改,修改会生成新对象
性能 较慢(涉及到原地修改操作) 较快(不需要考虑原地修改问题)
线程安全 不安全(多线程中可能被修改) 安全(无法修改,线程独立性好)

常见数据类型分类

可变类型 不可变类型
list(列表) int(整数)
dict(字典) float(浮点数)
set(集合) str(字符串)
bytearray(字节数组) tuple(元组)
自定义类(大多可变) frozenset(冻结集合)
bytes(字节序列)

例子

  1. 可变类型:列表

    lst = [1, 2, 3]
    print(id(lst)) # 查看内存地址
    lst.append(4)
    print(id(lst)) # 内存地址未变
    print(lst) # [1, 2, 3, 4]
  2. 不可变类型:字符串

    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 自定义类(默认不可哈希)

例子

  1. 可哈希对象

    t = (1, 2, 3)
    print(hash(t)) # 元组是可哈希的
    d = {t: "value"} # 元组作为字典键
    print(d)
  2. 不可哈希对象

    lst = [1, 2, 3]
    # print(hash(lst)) # 会报错:TypeError: unhashable type: 'list'
    s = {lst} # 报错,列表不可存入集合

3. 是否支持修改

定义

  • 支持修改:类型的内容可以直接增删改,操作后对象引用不变(通常是可变类型)。
  • 不支持修改:类型的内容一旦创建不可更改(通常是不可变类型)。

特性对比

特性 支持修改 不支持修改
修改操作 增删改操作直接修改原对象 任何修改操作生成新对象
内存地址 修改后地址不变 修改后地址发生变化

常见数据类型分类

支持修改类型 不支持修改类型
list(列表) str(字符串)
dict(字典) tuple(元组)
set(集合) frozenset(冻结集合)
bytearray(字节数组) bytes(字节序列)

例子

  1. 支持修改

    d = {"key": "value"}
    print(id(d)) # 查看字典地址
    d["new_key"] = "new_value"
    print(id(d)) # 地址不变
    print(d) # {"key": "value", "new_key": "new_value"}
  2. 不支持修改

    t = (1, 2, 3)
    # t[0] = 0 # 会报错:TypeError: 'tuple' object does not support item assignment

三者之间的联系

  1. 可变性与可哈希性

    • 通常 可变类型是不可哈希的,因为它们的值可能改变,哈希值会失效。
    • 例如,列表是可变的,所以不可哈希;而元组是不可变的,所以可哈希(前提是元素也可哈希)。
  2. 是否支持修改与可变性

    • 可变类型:通常支持修改。
    • 不可变类型:不支持修改。
  3. 不可变类型可哈希

    • 大多数不可变类型是可哈希的,例如 int, float, str, tuple

总结

特性 可变性 可哈希性 是否支持修改
list 可变 不可哈希 支持
tuple 不可变 可哈希(元素可哈希) 不支持
dict 可变 不可哈希 支持
set 可变 不可哈希 支持
frozenset 不可变 可哈希 不支持
str 不可变 可哈希 不支持

本文作者:清澈的澈

本文链接:https://www.cnblogs.com/lmc7/p/18642427

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   清澈的澈  阅读(55)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示