直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
(1)当a中没有子对象时
import copy a = [1, 2, 3, 4, "hello"] b = a #直接赋值 c = copy.copy(a) #浅拷贝 d = copy.deepcopy(a) #深拷贝 a.append(5) a.remove("hello") a.append("aa") #a[4].append(‘c‘) print("更新值a=",a) print("赋值 b=",b) #赋值时,当a改变时,b也改变 print("浅拷贝c=",c) #a和b是独立的对象,但是子对象指向同一个对象,如果子对象是一个列表,那么列表里的值会和a的相同 print("深拷贝d=",d) #a和b完全是独立的对象,子对象父对象都是独立的
运行结果:
更新值a= [1, 2, 3, 4, 5, ‘aa‘]
赋值 b= [1, 2, 3, 4, 5, ‘aa‘]
浅拷贝c= [1, 2, 3, 4, ‘hello‘]
深拷贝d= [1, 2, 3, 4, ‘hello‘]
此时,浅拷贝和深拷贝没有区别,都跟改变之前一样
(2)当a中有子对象时,子对象为可变数据类型(例如列表和字典)
import copy a = [1, 2, 3, 4, {1:"hello",2:"cc"}] b = a #直接赋值 c = copy.copy(a) #浅拷贝 d = copy.deepcopy(a) #深拷贝 a.append(5) a[4][3] = "ddd" #a[4].append(‘c‘) print("更新值a=",a) print("赋值 b=",b) #赋值时,当a改变时,b也改变 print("浅拷贝c=",c) #a和b是独立的对象,但是子对象指向同一个对象,如果子对象是一个列表,那么列表里的值会和a的相同 print("深拷贝d=",d) #a和b完全是独立的对象,子对象父对象都是独立的
运行结果:
更新值a= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}, 5]
赋值 b= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}, 5]
浅拷贝c= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘, 3: ‘ddd‘}]
深拷贝d= [1, 2, 3, 4, {1: ‘hello‘, 2: ‘cc‘}]
浅拷贝中: 子对象跟着一起更新了,但是5没有被添加进来
深拷贝中:还是跟a的初始值一样
可变数据类型:列表,字典,集合
不可变数据类型:数字,字符串,元组
原文:https://www.cnblogs.com/polly-chen/p/13599613.html