浅拷贝
注意:浅拷贝对不可变类型和可变类型的copy不同
copy.copy对于可变类型,会进行浅拷贝
copy.copy对于不可变类型,不会拷贝,仅仅是指向
import copy
# 浅拷贝,只是复制了地址,也就是说copy的最顶层
a = ["a1", "a2", "a3"]
b = a
print(">>"*50)
print(id(a))
print(id(b))
c = copy.copy(a)
print(">>"*50)
print(id(a))
print(id(c))
在看一个浅拷贝的例子
a = ["a1", "a2", "a3"]
b = ["b1", "b2", "b3"]
c = [a, b]
d = copy.copy(c)
print(">>"*50)
print(id(c))
print(id(d))
print("打印c和d里面的元素地址")
print(id(c[0]))
print(id(d[0]))
这就说明了一点,当a和b中的元素是不可变类型,那么使用copy方法拷贝的也是最顶层的,只是拷贝了一个内存空间,而各自的元素(c[0]和d[0]同一个地址,c[1]和d[1]也是同一个地址)将不会递归拷贝,还是指向以前的内存地址。
将各自的不可变元素在添加数据即可看出,看例子:
a = ["a1", "a2", "a3"]
b = ["b1", "b2", "b3"]
c = [a, b]
d = copy.copy(c)
print(">>"*50)
c[0].append("66")
d[0].append("77")
print("直接打印c和d")
print(c)
print(d)
注意:如果copy方法拷贝的是元组,它不会拷贝,直接指向
看例子:
# 深浅拷贝元组
a = ["a1", "a2", "a3"]
b = ["b1", "b2", "b3"]
c = (a, b)
d = copy.copy(c)
print("浅拷贝=====================")
print(id(c))
print(id(d))
print(">>"*10)
print(id(c[0]))
print(id(d[0]))
不管元素是否是可变和不可变类型,都不做拷贝
深拷贝
深拷贝就是将一个对象所有的内存地址,包括对象中的元素也都将递归拷贝
a = ["a1", "a2", "a3"]
b = ["b1", "b2", "b3"]
c = [a, b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(">>"*10)
print(id(c[0]))
print(id(d[0]))
注意:如果拷贝的是元组中的元素是不可变类型都是不做任何拷贝,只是指向.
案例:
a = (1, 2)
b = copy.copy(a)
print(id(a))
print(id(b))
没有任何变化
元组中的元素是可变类型,那么将全程递归拷贝,看案例
# 深浅拷贝元组
a = ["a1", "a2", "a3"]
b = ["b1", "b2", "b3"]
c = (a, b)
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(">>"*10)
print(id(c[0]))
print(id(d[0]))
作者:阿超
原创公众号:『Python日常笔记』,专注于 Python爬虫等技术栈和有益的程序人生,会将一些平时的日常笔记都慢慢整理起来,也期待你的关注和阿超一起学习,公众号回复【csdn】优质资源。