引子:首先我们有一个赋值运算作为引子,如下
1 l1 = [1, 2, 3, ['java', 'python']] 2 l2 = l1 3 l1[0] = 111 4 print(l1) #输出结果:[111, 2, 3, ['java', 'python']] 5 print(l2) #输出结果:[111, 2, 3, ['java', 'python']] 6 #由上面的例子我们不难明白,python中对于赋值运算来说,l1与l2指向的是同一个地址,所以他们是完全一样的。
1.浅拷贝copy()
1 l1 = [1, 2, 3, ['java', 'python']] 2 l2 = l1.copy() 3 print(l1,id(l1)) #输出结果:[1, 2, 3, ['java', 'python']] 46594648 4 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 46861728 5 6 l1[2] = 222 7 print(l1,id(l1)) #输出结果:[1, 2, 222, ['java', 'python']] 46594648 8 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 46861728 9 10 l1[1] = 333 11 print(l1,id(l1)) #输出结果:[1, 333, 222, ['java', 'python']] 86112856 12 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 86707576 13 14 l1[3][0] = 'c++' 15 print(l1,id(l1)) #输出结果:[1, 333, 222, ['c++', 'python']] 88013360 16 print(l2,id(l2)) #输出结果:[1, 2, 3, ['c++', 'python']] 88608080 17 #对于浅拷贝来说,第一层创建的是新的地址,然而第二层就不一样的,输入的改变也会影响到拷贝项的改变
2.深拷贝deepcopy
1 import copy 2 l1 = [1, 2, 3, ['java', 'python']] 3 l2 = copy.deepcopy(l1) 4 5 print(l1,id(l1)) #输出结果:[1, 2, 3, ['java', 'python']] 57042104 6 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 57043024 7 8 l1[2] = 222 9 print(l1,id(l1)) #输出结果:[1, 2, 222, ['java', 'python']] 57042104 10 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 57043024 11 12 l1[1] = 333 13 print(l1,id(l1)) #输出结果:[1, 333, 222, ['java', 'python']] 57042104 14 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 57043024 15 16 l1[3][0] = 'c++' 17 print(l1,id(l1)) #输出结果:[1, 333, 222, ['c++', 'python']] 57042104 18 print(l2,id(l2)) #输出结果:[1, 2, 3, ['java', 'python']] 57043024 19 #对于深拷贝deepcopy来说,无论创建多少个,这些每个之间都是独立的,改变任意一个元素,
20 #都不会影响到其他的,无论多少层都是一样的