Python日常笔记(30)- 浅拷贝深拷贝

浅拷贝

注意:浅拷贝对不可变类型和可变类型的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】优质资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值