国际访客建议访问 Primers 编程伙伴 国际版站点 > Python 教程 > 类型的可变性 以获得更好的体验。

# Python 类型的可变性

在 Python 中,类型的可变性(mutability) 指的是对象的值在创建之后是否可以被修改。

根据这一特性,Python 中的数据类型可以分为:可变类型(Mutable Types)和 不可变类型(Immutable Types)。

# 可变类型

Python 的 所有类型都是引用类型,如果将一个变量赋值给另一个变量,它们将引用同一份实体。

因此,对于可变类型而言,通过任意一个变量修改内部的值都会影响到另一个变量。

常见的可变类型有:listdictsetbytearray,自定义的类。

flowchart LR
    var1["变量 numbers"] -- 引用 --> value["值 \n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"]
    var2["变量 shadow"] -- 引用 --> value

示例:

运行示例

numbers:list[int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  # 创建了列表 [0, ..., 9],并赋值给变量 numbers
shadow:list[int] = numbers                          # 变量 numbers 赋值给 shadow,也即引用源头的 [0, ..., 9]

numbers[1] = 233                                    # 修改 numbers[1] 的值
print(shadow[1])                                    # 查看 shadow[1] 的值

shadow[2] = 666                                     # 修改 shadow[2] 的值
print(numbers[2])                                   # 查看 numbers[2] 的值

print(numbers)                                      # 查看整个列表
print(shadow)

在这个示例中,修改 numbers[1] 的值后查看 shadow[1] 可以发现 shadow[1] 也改变了; 修改修改 shadow[2] 的值后查看 numbers[2] 可以发现 numbers[2] 也改变了。

如果想要两个列表互不影响,就需要通过调用 list 函数创建新的列表:

运行示例

numbers:list[int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  # 创建了列表 [0, ..., 9],并赋值给变量 numbers
shadow:list[int] = list(numbers)                    # 基于 numbers 的值创建新的列表,并赋值给 shadow

numbers[1] = 233                                    # 通过 numbers 修改列表元素
shadow[2] = 666                                     # 通过 shadow 修改列表元素

print(numbers)
print(shadow)

# 不可变类型

不可变类型 的值是无法修改的,对它们的 赋值 实际上是创建了一个新的对象。因此,引用同一个实体的对象之间不会感知到互相影响。

常见的不可变类型有:Noneintfloatboolstrtuplefrozensetbytes 等。

digraph G {
    rankdir=LR;

    subgraph cluster_1 {
        label = "After";
        svalue [label="值 11"];
        nvalue [label="值 10"];
        shadow2 [label="变量 shadow"];
        number2 [label="变量 number"];
    
        shadow2 -> svalue [label="引用"];
        number2 -> nvalue [label="引用"];
    }
    
    subgraph cluster_0 {
        label = "Before";
        value [label="值 10"];
        number [label="变量 number"];
        shadow [label="变量 shadow"];
    
        number -> value [label="引用"];
        shadow -> value [label="引用"];
    }
}

运行示例

number:int = 10         # 创建了值为 10 的整数,并赋值给变量 number 
shadow:int = number     # 变量 number 赋值给 shadow,也即引用源头的 10

number = 11             # 修改 number 并非将 10 修改为11,而是创建了新的值为 11 的整数并赋值给 number

print(number)           # number 引用的值为 11
print(shadow)           # shadow 仍引用原先的值
本文 更新于: 2025-11-27 09:37:56 创建于: 2025-11-27 09:37:56