对于不可变的数据类型,字符串,元组和数字来讲,赋值号、深copy和浅copy没有区别。
n=1
s=n
s1=copy.copy(n)
s2=copy.deepcopy(n)
print(id(n),id(s),id(s1),id(s2))
#输出地址都一样
对于可变数据类型,list,dict和set,赋值号是引用原来的对象,与原对象是同一个地址;浅copy是新复制一个父级的对象,因此父级对象的改变,浅copy不会受影响,但不复制子级对象,即与原对象共用子级对象,因此子级对象的改变时,原对象和浅copy出来的对象均会改变;deepcopy是完全新复制一个对象,具有完全不一样的id。
dict1 = {'user': 'runoob', 'num': [1, 2, 3],'cc':[1,2,3,[4,5]]}
dict2 = dict1 # 赋值: 引用对象
dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,子对象是引用
dict4=copy.deepcopy(dict1)#深copy,原对象任何操作不会影响copy出来的对象
# 修改 data 数据
dict1['user'] = 'root'
dict1['num'].remove(1)
dict1['ai']='kunkun'
dict1['cc'][3][0]=8
# 输出结果
print(dict1)#{'user': 'root', 'num': [2, 3], 'cc': [1, 2, 3, [8, 5]], 'ai': 'kunkun'}
print(dict2)#{'user': 'root', 'num': [2, 3], 'cc': [1, 2, 3, [8, 5]], 'ai': 'kunkun'}
print(dict3)#{'user': 'runoob', 'num': [2, 3], 'cc': [1, 2, 3, [8, 5]]}
print(dict4)#{'user': 'runoob', 'num': [1, 2, 3], 'cc': [1, 2, 3, [4, 5]]}