可变数据类型与不可变数据类型【python】

在Python的数据类型根据其值是否可以被修改分为可变(mutable)和不可变(immutable)两类。

一、不可变数据类型

  • 特点:创建后值不能被修改,任何修改操作都会生成新对象。
  • 示例
    • 数值类型int, float, complex
    • 字符串str
    • 元组tuple
    • 布尔值bool
    • 冻结集合frozenset
示例代码
# 字符串不可变
s = "hello"
s[0] = "H"  # 报错:TypeError

# 正确修改方式(生成新对象)
s = "H" + s[1:]  # 创建新字符串 "Hello"

# 元组不可变
t = (1, 2, 3)
t[0] = 100  # 报错:TypeError

二、可变数据类型

  • 特点:对象的值可以被直接修改,内存地址不变。
  • 示例
    • 列表list
    • 字典dict
    • 集合set
    • 自定义类实例(默认可变)
示例代码
# 列表可变
lst = [1, 2, 3]
lst[0] = 100  # 修改第一个元素
print(lst)    # 输出:[100, 2, 3]

# 字典可变
d = {"name": "Alice", "age": 30}
d["age"] = 31  # 修改值
d["city"] = "New York"  # 添加新键值对
print(d)  # 输出:{'name': 'Alice', 'age': 31, 'city': 'New York'}

三、关键区别总结

  1. 内存地址

    • 不可变类型修改时会创建新对象(内存地址改变)。
    • 可变类型修改时直接更新原对象(内存地址不变)。
  2. 哈希性

    • 不可变类型可作为字典的键或集合的元素(可哈希)。
    • 可变类型不可哈希,不能作为字典键或集合元素。
  3. 使用场景

    • 不可变类型适合需要固定值的场景(如配置、常量)。
    • 可变类型适合需要动态修改数据的场景(如缓存、动态列表)。

常见误区

  • 字符串拼接s += "a" 看似修改原字符串,实际创建了新字符串。
  • 元组中的可变元素:元组本身不可变,但如果元素是可变类型(如列表),则元素内容可修改。
t = (1, [2, 3])
t[1][0] = 200  # 元组中的列表可以修改
print(t)  # 输出:(1, [200, 3])

你可能感兴趣的:(python,开发语言)