python的可变类型和不可变类型
在学习python过程中我们一定会遇到不可变数据类型和可变数据类型。
以下所有的内容都是基于内存地址来说的。
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
总结:不可变数据类型更改后地址发生改变,可变数据类型更改地址不发生改变
Python有六种数据类型:数字类型、字符串类型、列表类型、元组类型、字典类型和集合类型
其中不可变类型包括三种:数字类型、字符串类型和元组类型
剩余三种为可变类型:列表类型、字典类型和集合类型
可变类型:
- 可以修改对象的的值,修改后对象的内存地址不变(变量与内存地址链接:常量、变量、内存)
- 可变类型包括:列表、字典、可变集合
>>> s = [1, 2, 3, 4, 5] >>> id(s) 2115225773704 >>> s[2] = "a" >>> s [1, 2, 'a', 4, 5] >>> id(s) 2115225773704
>>> d = {"name": "bone", "age": 26} >>> id(d) 2115223112656 >>> d["age"] = 25 >>> d {'name': 'bone', 'age': 25} >>> id(d) 2115223112656
>>> a = {1, 2, 3} >>> id(a) 2115225769128 >>> a.add(4) >>> id(a) 2115225769128 >>> a {1, 2, 3, 4}
不可变类型
- 值变了,内存地址就变了,等于重新定义
- 在尝试修改对象元素时,实际上是重新开辟了内存空间来存储的
- 不可变类型有:数值、元组、字符串、不可变集合
- 对于不可变类型的对象,他们都没有涉及到修改的方法,尝试使用就会报错
>>> a = (1,2,3) >>> a[1] = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> a = "bone" >>> a[1: 3] = "x" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> a = frozenset({1, 2, 3}) >>> a frozenset({1, 2, 3}) >>> id(a) 2115225768456 >>> a.add(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'frozenset' object has no attribute 'add'