Python3学习笔记(九):赋值,浅拷贝和深拷贝区别
一、变量赋值
在Python可变数据类型(列表,字典,集合)中,把一个可变数据类型的变量赋给另一个变量,这两个变量引用的是同一个对象,内存地址是一样的,修改当中的一个变量,另一个变量相应也会被修改
>>> a = [1,2,3,4,5] >>> b = a >>> id(a) 2846410718600 # 变量a的内存地址 >>> id(b) 2846410718600 # 变量b的内存地址 >>> a[0]=0 >>> a [0, 2, 3, 4, 5] >>> b [0, 2, 3, 4, 5]
二、浅拷贝
拷贝了一个对象的顶层,只拷贝了对象的"引用"
>>> a = [[1,2,3],4,5] >>> b = a.copy() >>> a [[1, 2, 3], 4, 5] >>> b [[1, 2, 3], 4, 5] >>> id(a) # 变量a的内存地址 2846410784136 >>> id(b) # 变量b的内存地址 2846410717512 >>> id(a[0]) # 变量a中第一个元素的内存地址 2846410718152 >>> id(b[0]) 2846410718152 # 变量b中第一个元素的内存地址
修改对象中的不可变类型数据,另一个变量不受影响;修改对象中的可变类型子数据,另一个变量相应改变
>>> a = [[1,2,3],4,5] >>> b = a.copy() >>> a[1] = 6 # 修改的为不可变数据类型 >>> a [[1, 2, 3], 6, 5] >>> b [[1, 2, 3], 4, 5] >>> a[0][1]=0 # 修改的为可变(列表中的数据)数据类型 >>> a [[1, 0, 3], 6, 5] >>> b [[1, 0, 3], 4, 5]
三、深拷贝
对对象中的每一层都进行了拷贝,拷贝后的对象与原对象为完全独立,没有任何关系。
>>> from copy import deepcopy >>> a = [[1,2,3],4,5] >>> b = deepcopy(a) >>> a [[1, 2, 3], 4, 5] >>> b [[1, 2, 3], 4, 5] >>> id(a) 2846410715976 >>> id(b) 2846410515720 >>> id(a[0]) 2846410717896 >>> id(b[0]) 2846410718856
即使修改当中一个变量的可变类型子数据,另一个变量也不会受影响
>>> from copy import deepcopy >>> a = [[1,2,3],4,5] >>> b = deepcopy(a) >>> a [[1, 2, 3], 4, 5] >>> b [[1, 2, 3], 4, 5] >>> a[0][1]=0 >>> a [[1, 0, 3], 4, 5] >>> b [[1, 2, 3], 4, 5]