python深浅拷贝

浅拷贝copy

深拷贝deepcopy

浅拷贝copy

1)copy就是浅copy,意思是把对象a的所有内容,找到一个内存空间再存放一份,再赋值为新的变量。比如:

a=[1,2,3]
from copy import copy
cpy_a = copy(a)

print(a)     # 此时a的结果为[1,2,3]
print(cpy_a)  # 此时cpy_a的结果为[1,2,3]

# 这一步是对cpy_a进行操作
cpy_a.append(4)

# 接下来输出a和cpy_a的结果,看对cpy_a的操作是否会影响到a的值
print(a)    # 此时a的结果为[1,2,3]
print(cpy_a)  # 此时cpy_a的结果为[1,2,3,4] 

  

注意区分:copy和赋值,赋值是简单的写了个别名,比如:

a=[1,2,3]
b=a

此时id(a)如果是664d6w,那么id(b)也是664d6w,两者的地址一样,只是名字不同,与浅copy是不一样的 

深拷贝deepcopy

  针对只含有值的对象来说,浅copy就可以满足,但如果一个对象中又含有其他对象,使用浅copy就只会把包含的id给

复制一份,那么对新对象的内容的操作就会影响到旧对象的内容。此时就只能使用深拷贝deepcopy,即递归查找引用对象,找到内存单元,拷贝内容并开辟内存空间,再存放一份。

a=[1,2]
b=[a,a]#这里是直接引用,就是对象包含对象,想拷贝只能使用深拷贝
from copy import deepcopy
dcpy_b=deepcopy(b)

print(b)  # 此时b的结果为[[1,2],[1,2]]
print(dcpy_b)  # 此时c的结果为[[1,2],[1,2]]

# 对dcpy_b进行操作
dcpy_b[0].append(3)
# 接下来输出b和dcpy_b的结果
print(b)  # 此时b的结果为[[1,2],[1,2]]
print(dcpy_b)  # 此时dcpy_b的结果为[[1,2,3],[1,2,3]]

对深拷贝deepcopy后的内容(dcpy_b)做修改不会影响到原内容(b)。

原文地址:https://www.cnblogs.com/liya1014/p/14751554.html