py基础系列(三):python容器数据类型(下)
可变类型和不可变类型
Python数据类型又可分为: 不可变数据类型 和 可变数据类型 。
不可变数据类型
不可变数据类型的学术定义是:
如果变量的值发生了改变,其对应的内存地址也会发生改变,这种数据类型称为不可变数据类型。
换言之,这种类型的地址受值的影响,为了使地址稳定,应当不修改原内存单元的数据,因而可以作为hash算法的键。(hash算法是一种把key变成内存地址的算法)
整型、浮点型、字符串型和元组属于不可变数据类型。
可变数据类型
可变数据类型的学术定义是:
如果变量的值发生了改变,但其对应的内存地址不变,则这种数据类型称为可变数据类型。
这种数据类型,你可修改原内存单元的数据。列表、字典和集合是可变数据类型,因此不可作为字典的键。
这两个名字比较具有迷惑性。==不可变不是指的经赋值之后值就不可以修改了,而是说原先赋值的内存空间不允许进行修改。==换言之,修改数据的值,不是在原先地址上进行赋值,而是重新为变量分配地址空间(旧的地址空间会被回收)。像int、double、str、tuple。
例如下面的例子:
因为a为整型,整型为不可变数据类型,所以a在重新赋值时,会使用新的内存空间存储新值,变量a也指向重新申请的内存地址。旧的内存趋于如果未被其他变量指向,那么会被舍弃有Python自动回收空间。
可变指的是,是可以在原先地址上进行赋值无需重新分配地址空间,因此可以变化值(可变)。像dict、list、set。
例如:
lst为列表,列表为可变类型,对值的修改都是在同一块内存上。
不可变数据变量之间的赋值
y被赋值为x后,值和地址都与x一样,但是由于x为不可变数据,所以当y的值改变时,x独立不受影响(实际上y在重新赋值时,其实变量y指向重新申请的内存地址)
可变数据变量之间的赋值问题
可变数据变量赋值时内存地址指向相同的问题,因此动一发而牵全身。
不可变类型可以作为键
字典为可变类型 不能作为键
浅复制和深复制
浅复制
调用格式:
列表对象.copy()
浅复制不能解决可变类型里嵌套可变类型
浅复制的两个变量lst和lst2虽然内存地址不同,但是如果变量内含有可变数据元素,那么这些浅复制时可变元素的内存地址还是相同的,改变一个可变元素的值,另一个可变元素也会受到影响。
例如下面:
深复制
可借助copy模块中的 deepcopy() 函数进行深复制。
参考资料