深浅拷贝

复制:赋值后完全一样,指向内存空间。

l1 = [1,2,3,['barry','alex']]
第一步:把l1赋值给l2 l2
= l1 第二步:修改l1的索引值
查看l1、l2的值,现象是完全一致 l1[0]
= 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] 第三步:修改l1第二层的值
  值仍然相同 l1[
3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
结论:赋值是内存指向变量,所以值是相同的


浅拷贝:嵌套型数据类型第一层拷贝后是完全是两份,改变其中一个

l1 = [1,2,3,['barry','alex']]

  第一步:拷贝l1赋值给l2 l2 = l1.copy()
查看l1与l2的内存地址
现象是l1与l2是完全不一样的两份 print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2380296895816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2380296895048
第二步:修改第一层的数据
现象:内存地址仍然是两份完全不同的 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2593038941128 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2593038941896 第三步:修改内层数据
现象:修改后内存地址仍然一致 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016 print(l2,id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016
现象:浅拷贝后修改第一层内存地址不同,修改第二层内存地址相同


深拷贝:拷贝后无论多少层都一样

import copy
l1 = [1,2,3,['barry','alex']]
第一步l1深拷贝赋值给l2 l2
= copy.deepcopy(l1) 第二步:查看l1与l2的id值 print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 第三步:修改第一层的数据
现象:内存地址不一样 l1[
1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 第四步:修改内层数据
现象:内存地址仍然不同 l1[
3][0] = 'wusir' print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2915377167240 print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2915377167304
结论:深拷贝拷贝后内存地址是完全不同的两份数据,无论修改几层嵌套内存地址都是完全不同的
原文地址:https://www.cnblogs.com/wanghuaqiang/p/8987644.html