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