2831

14 分钟

#Python 类型的可变性

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

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

#可变类型

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

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

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

引用

引用

变量 numbers

值 \n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

变量 shadow

示例:

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)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

在这个示例中,修改 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)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#不可变类型

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

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

G cluster_1 After cluster_0 Before svalue 值 11 nvalue 值 10 shadow2 变量 shadow shadow2->svalue 引用 number2 变量 number number2->nvalue 引用 value 值 10 number 变量 number number->value 引用 shadow 变量 shadow shadow->value 引用
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 仍引用原先的值

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

创建于 2025/6/10

更新于 2025/6/10