深拷贝与浅拷贝

python的赋值与c++不同

问题缘由

​ 之前被坑过一次,结果忘了总结。这次写元胞自动机的时候发现了这个bug,让我迷惑很久才想起来这个问题,遂记录。

具体如下:

a=[1,2,3]
b=a
a.append(1)
print('a =',a,'b=',b)
# a = [1, 2, 3, 1] b= [1, 2, 3, 1]
b.append(11)
print('a =',a,'b=',b)
# a = [1, 2, 3, 1, 11] b= [1, 2, 3, 1, 11]

print(id(a),id(b))
# 3002845450824 3002845450824

c++使用变量前会需要先声明变量,故每一个变量都会先有一个地址,而python不需要先命名故会发生这种奇怪的情况,于是就引出了python中的变量空间问题。

python中的拷贝可以理解为创建一个新的命名空间,而不是’真正的拷贝’

浅拷贝

只会被可变类型第一项进行拷贝,不会对子对象进行拷贝。

什么是可变类型?list,dict,set都是可变类型,可以简单理解为可以动态增删改查的数据结构。

import copy
a=[1,2,3,[1,2,3]]
b=a
b.append(1)
print('a =',a,'b=',b)
# a = [1, 2, 3, [1, 2, 3], 1] b= [1, 2, 3, [1, 2, 3], 1]
print(id(a),id(b))
# 2555694210504 2555694210504
# 浅拷贝,只拷贝第一个可变类型
b=copy.copy(a)
b.append(2)
print('a =',a,'b=',b)
# a = [1, 2, 3, [1, 2, 3], 1] b= [1, 2, 3, [1, 2, 3], 1, 2]
print(id(a),id(b))
# 2555694210504 2555694194440
print(id(a[3]),id(b[3]))

深拷贝

​ 可以对全部可变类型进行拷贝,所有子对象进行拷贝(可以理解真正的创建了一个变量)

import copy
a=[1,2,3,[1,2,3]]
b=a
b.append(1)
print('a =',a,'b=',b)
# a = [1, 2, 3, [1, 2, 3], 1] b= [1, 2, 3, [1, 2, 3], 1]
print(id(a),id(b))
# 2555694210504 2555694210504
# 浅拷贝,只拷贝第一个可变类型
b=copy.deepcopy(a)
b.append(2)
print('a =',a,'b=',b)
# a = [1, 2, 3, [1, 2, 3], 1] b= [1, 2, 3, [1, 2, 3], 1, 2]
print(id(a),id(b))
# 2555694210504 2555694194440
print(id(a[3]),id(b[3]))
总之,deepcopy准没错