python copy(浅拷贝)和deepcopy(深拷贝)
copy:只拷贝最外层数据,不拷贝里面的子层数据,即子层数据是共享的,不管修改源对象还是拷贝对象的子层数据,源数据和拷贝数据都会被修改
deepcopy:拷贝全部数据,包含所有子层
- 浅拷贝copy
#coding:utf-8
list1 = [[1,2],3,4]
list2 = list1
print(list1)
print(list2)
#[[1, 2], 3, 4]
#[[1, 2], 3, 4]
list3拷贝list1,实际上是list3重新申请了一个内存地址,指向list1的值
list1 = [[1,2],3,4]
list3 = list1.copy()
print (list3)
#[[1, 2], 3, 4]
将源数据外层list1[1]修改为a,实际新开了一个内存存放变量a,而list1[1]指向a这个地址,不影响拷贝后的对象
list1 = [[1,2],3,4]
list4 = list1.copy()
list1[1] ='a' #修改原list(不修改子list),不影响copy后list
print(list1)
print(list4)
#[[1, 2], 'a', 4]
#[[1, 2], 3, 4]
将拷贝数据外层list5[1]修改为b,实际新开了一个内存存放变量b,而list5[1]指向b这个地址,不影响源对象
list1 = [[1,2],3,4]
list5 = list1.copy()
list5[1] ='b' #修改copy后list(不修改子list),不影响原list
print(list1)
print(list5)
#[[1, 2], 3, 4]
#[[1, 2], 'b', 4]
将拷贝数据外层list6[0][0]修改为c,实际新开了一个内存存放变量c,而list6[0][0]指向c这个地址,这时候源数据list[0]也指向了这一块共享的区域,同样list[0][0]也发生了变化,指向了c,所以数据都会变化,如下
list1 = [[1,2],3,4]
list6 = list1.copy()
list1[0][0] ='c' #修改原list的子list,影响copy后list
print(list1)
print(list6)
#[['c', 2], 3, 4]
#[['c', 2], 3, 4]
list1 = [[1,2],3,4]
list7 = list1.copy()
list7[0][0] ='c' #修改copy后list的子list,影响原list
print(list1)
print(list7)
#[['c', 2], 3, 4]
#[['c', 2], 3, 4]
删除源数据以后, 实际删除了list1对象,并不会删除数值,所以打印list1会报错,拷贝对象list7数据不变
list1 = [[1,2],3,4]
list7 = list1.copy()
del list1
#print(list1)
print(list7)
#[[1, 2], 3, 4]
-
深拷贝deepcopy
深拷贝从源对象完全克隆出数据,和源数据没有任何关联,所以修改数据只会影响自身
from copy import deepcopy
list1 = [[1,2],3,4]
list8 = deepcopy(list1)
print (list8)
#[[1, 2], '3', 4]
list1 = [[1,2],3,4]
list9 = deepcopy(list1)
list1[1] = 'a'
print (list1)
print (list9)
#[[1, 2], 'a', 4]
#[[1, 2], 3, 4]
list1 = [[1,2],3,4]
list10 = deepcopy(list1)
list10[1] = 'a'
print (list1)
print (list10)
#[[1, 2], 3, 4]
#[[1, 2], 'a', 4]
list1 = [[1,2],3,4]
list11 = deepcopy(list1)
list11[0][0] = 'a'
print (list1)
print (list11)
#[[1, 2], 3, 4]
#[['a', 2], 3, 4]
list1 = [[1,2],3,4]
list12 = deepcopy(list1)
list1[0][0] = 'a'
print (list1)
print (list12)
#[['a', 2], 3, 4]
#[[1, 2], 3, 4]