对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
对于字典、元祖、列表而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
1.赋值。
赋值,只是创建一个变量,该变量指向原来内存地址,如:
2.浅拷贝
浅拷贝,在内存中只额外创建第一层数据。
import copy n1 = {"x1":"Hello","x2":520,"x3":["World",999]} n3 = copy.copy(n1) print("n1的内存地址为:\n",id(n1)) print("浅拷贝后,n3是新的内存地址,在内存中只额外创建第一层数据:\n",id(n3))
print("n1的结果为:\n",n1) print("n3的结果为:\n",n3)
n3['x1']='你好' # 修改第1层数据 print("n3的结果为:\n",n3) # n3第1次变化 print("n1的结果为:\n",n1) # 原数据n1不变
n3['x3'][0]='世界' # 修改第2层数据 print("n3的结果为:\n",n3) # n3第2次变化 print("n1的结果为:\n",n1) # 原数据变化!
3.深拷贝。
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
import copy n1 = {"x1":"Hello","x2":520,"x3":["World",999]} n4 = copy.deepcopy(n1) print("n1的内存地址为:\n",id(n1)) print("浅拷贝后,n4是新的内存地址,在内存中将所有的数据重新创建一份(排除最后一层):\n",id(n4))
n4['x1']='你好' # 修改第1层数据 print("n4的结果为:\n",n4) # n4第1次变化 print("n1的结果为:\n",n1) # 原数据n1不变
n4['x3'][0]='世界' # 修改第2层数据 print("n4的结果为:\n",n4) # n4第2次变化 print("n1的结果为:\n",n1) # 原数据n1不变