Python中(不)可变类型,引用,深浅copy
1.Python中不可变类型和可变类型的数据
可变类型(数据存储空间中的数据可以被改变):列表,集合,字典,对象
不可变类型(...不可以被改变):元组,字符串,数值,布尔
2.引用
引用:一种变量指向数据存储空间的现象
既是指:相同的数据在内存空间中仅占用一个存储空间,不同的变量使用相同的数据则指向相同的存储空间
3.深浅copy
1.浅copy,可变数据类型
import copy
a = [1,2]
b = a
此时 a,b的id相同,因为a,b同时指向了[1,2],其他任意一个变量都能修改列表数据
b = copy.copy(a) # b浅copy a
此时a,b的id不同,任意变量修改列表的值,不影响其他变量的值
a.append(3) # a [1,2,3] b仍然是 [1,2]
在可变数据类型中,=这种基本的浅copy使多个变量执行同一个内存地址
而copy.copy(变量),会copy最基层的数据,就是变量指向的数据空间
当可变类型的数据被copy时,会申请新的内存空间,并使变量指向新的内存空间
# ----------------------------------------
2.浅copy,不可变数据类型
import copy
a = (1,) # 元组
b = a # id相同
b = copy.copy(a) # a,b的id仍然相同
对于不可变类型来说,它在内存中的地址是固定的,不能重新申请内存空间
无论是=还是使用浅copy都不能对数据进行复制申请新的内存空间,只是同时指向了同一个内存空间
3.深copy deepcopy ,深copy保证了数据的独立性不受其他变量的影响,在递归和嵌套循环需要使用前面函数的数据时进行深copy,保证了数据不受影响,独立存在
deepcopy是对一个对象的深层copy,递归copy,完全复制一个对象
对不可变类型数据深copy:
如果不可变类型对象没有内嵌可变类型对象,此时的深copy和浅copy相同,只是copy了引用,
如果内嵌了可变类型,这时的深copy就是完全复制了这个不可变对象,id就不相同了
4.一般在爬虫开发中,爬取的数据存放在字典中,在循环爬取过程中,需要引用字典来存储数据
或者在回调函数中进行传递,因为字典是可变类型,相同key的下一组数据在循环存入时,会覆盖
原来字典的值,因此在字典传递时,对字典进行深copy,这样传递出去的字典就是一个独立的数据,
不在受后面操作的影响,保证了数据的独立性