在 Python 中,类型的可变性(mutability) 指的是对象的值在创建之后是否可以被修改。
根据这一特性,Python 中的数据类型可以分为:可变类型(Mutable Types)和 不可变类型(Immutable Types)。
Python 的 所有类型都是引用类型,如果将一个变量赋值给另一个变量,它们将引用同一份实体。
因此,对于可变类型而言,通过任意一个变量修改内部的值都会影响到另一个变量。
常见的可变类型有:list,dict,set,bytearray,自定义的类。
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)
不可变类型 的值是无法修改的,对它们的 赋值 实际上是创建了一个新的对象。因此,引用同一个实体的对象之间不会感知到互相影响。
常见的不可变类型有:None,int,float,bool,str,tuple,frozenset,bytes 等。
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 仍引用原先的值