浅拷贝:对引用的拷贝,拷贝的是地址。原对象中的可变类型改变,拷贝也会改变。不可变类型改变,拷贝不变。
深拷贝:对对象的资源的拷贝,拷贝的是值。原对象改变,拷贝对象不会改变
首先,对赋值操作我们要有以下认识:
import copy a = ['hello', [1, 2, 3]] b = copy.copy(a) print('原容器:', a, '地址:', [id(i) for i in a]) print('浅拷贝:', b, '地址:', [id(j) for j in b])
原容器: ['hello', [1, 2, 3]] 地址: [2719850669312, 2719853248072]
浅拷贝: ['hello', [1, 2, 3]] 地址: [2719850669312, 2719853248072]
import copy a = ['hello', [1, 2, 3]] b = copy.copy(a) print('原容器:', a, '地址:', [id(i) for i in a]) print('浅拷贝:', b, '地址:', [id(j) for j in b]) a[0] = 'world' a[1].append(4) print('原容器修改后:', a, '地址:', [id(i) for i in a]) print('原容器修改后的浅拷贝:', b, '地址:', [id(j) for j in b])
原容器修改后: ['world', [1, 2, 3, 4]] 地址: [2719850669480, 2719853248072]
原容器修改后的浅拷贝: ['hello', [1, 2, 3, 4]] 地址: [2719850669312, 2719853248072]
总结
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
import copy a = ['hello', [1, 2, 3]] c = copy.deepcopy(a) print('原容器:', a, '地址:', [id(i) for i in a]) print('深拷贝:', c, '地址:', [id(j) for j in c])
原容器: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450568]
深拷贝: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450248]
import copy a = ['hello', [1, 2, 3]] c = copy.deepcopy(a) print('原容器:', a, '地址:', [id(i) for i in a]) print('深拷贝:', c, '地址:', [id(j) for j in c]) a[0] = 'world' a[1].append(4) print('原容器修改后:', a, '地址:', [id(i) for i in a]) print('原容器修改后深拷贝:', c, '地址:', [id(j) for j in c])
原容器修改后: ['world', [1, 2, 3, 4]] 地址: [3100654871976, 3100657450568]
原容器修改后深拷贝: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450248]
总结
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。