python直接赋值、深浅拷贝实例剖析
根据数据类型分为两部分进行剖析:
- int、str类型
- list、tuple、dict类型等
1. int、str类型
【int类型实例】 >>> import copy # 导入copy模块 >>> a1=11 >>> a2=a1 # 直接赋值引用 >>> a3=copy.copy(a1) # 浅拷贝 >>> a4=copy.deepcopy(a1) # 深拷贝 >>> id(a1),id(a2),id(a3),id(a4) >>> (1357559168, 1357559168,1357559168,1357559168) 【str类型实例】 >>> import copy # 导入copy模块 >>> b1='css' >>> b2=b1 # 直接赋值引用 >>> b3=copy.copy(b1) # 浅拷贝 >>> b4=copy.deepcopy(b1) # 深拷贝 >>> id(b1), id(b2),id(b3),id(b4) >>> (43826624,43826624,43826624,43826624)
由以上实例可得出:int和str类型,无论是直接赋值引用 or 深浅拷贝,均指向同一块内存空间,因此对于int和str类型的变量而言,三种方法作用相同
2. list、tuple、dict等类型(以list类型为例)
【示例】 >>> import copy # 导入copy模块 >>> L1=[11,22,33,['a','b','c']] # 定义list变量,其中L1[3]的值是一个子列表 >>> L2=L1 # 直接赋值引用 >>> L3=copy.copy(L1) # 浅拷贝 >>> L4=copy.deepcopy(L1) # 深拷贝 >>> id(L1),id(L2),id(L3),id(L4) >>> (43777928,43777928,43776968,43795912) >>> L1.append(44) # L1列表父对象添加元素 >>> L1[3].append('d') # L1列表子对象添加元素 >>> L1 >>> [11,22,33,['a','b','c','d'],44] >>> L2 >>> [11,22,33,['a','b','c','d'],44] >>> L3 >>> [11,22,33,['a','b','c','d']] >>> L4 >>> [11,22,33,['a','b','c']]
以上示例说明:
1. 直接赋值即是对象的引用,指向同一内存地址
2. 浅拷贝:只拷贝一层,如上述示例,只拷贝父对象,不拷贝父对象内部的子对象(L3[3]仍指向原L1子对象的内存地址),故分别在L1父对象和子对象中添加元素44和'd', 对L3父对象无影响,只对其子对象有影响
3. 深拷贝:拷贝父对象及子对象
三人行,必有我师