python深copy与浅copy的区别
首先先看一段代码
import copy a = [1, 2, 3, [4]] b = a c = a.copy() d = copy.deepcopy(a) e = copy.copy(a) a.append(4) a[3].append(5) print('a值为 {} 地址为 {}'.format(a, id(a))) print('b值为 {} 地址为 {}'.format(b, id(b))) print('c值为 {} 地址为 {}'.format(c, id(c))) print('d值为 {} 地址为 {}'.format(d, id(d))) print('e值为 {} 地址为 {}'.format(e, id(e)))
执行结果:
a值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360 b值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360 c值为 [1, 2, 3, [4, 5]] 地址为 4555873544 d值为 [1, 2, 3, [4]] 地址为 4556227912 e值为 [1, 2, 3, [4, 5]] 地址为 4556227464
从结果中可以看出来:
b赋值的为a的内存地址,值会随着a的变化而变化---直接赋值,对象引用
c=a.copy()使用的为python自带的copy方法,从结果中可看出复制后c中的父级内容不随着a的变化而变化,但c里面的子list随着a的变化而变化,---浅copy,拷贝父对象,不会拷贝对象的内部的子对象
d和e使用的是python自带的copy模块中的copy方法和deepcopy方法:
其中d的值地址和a不一致,值也不会随着a的变化而变化---深copy,完全拷贝了父对象及其子对象
其中e中父级内容不随着a的变化而变化,但e中子list中内容会随着a的变化而变化---浅copy,拷贝父对象,不会拷贝对象的内部的子对象
print('a子对象值为 {} 地址为 {}'.format(a[3], id(a[3]))) print('e子对象值为 {} 地址为 {}'.format(a[3], id(a[3]))) 结果: a子对象值为 [4, 5] 地址为 4334486344 e子对象值为 [4, 5] 地址为 4334486344
由上可得出,python中的copy分为三种:
1、直接复制:也就是对象引用
2、浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。
3、深拷贝:完全拷贝了父对象及其子对象