再见深浅拷贝

为什么会引入拷贝

我们都知道,将数据赋值给某些变量,实则是将数据存储的地址引用赋值给变量,当多个变量同时引用了同一个数据地址时,改变其中一个变量,数据将会随之改变,其它引用也会改变。但在实际操作过程中,有些数据是不希望能够变化的,为了解决这个问题,引入了深浅拷贝,对于可变数据,对数据引用的地址进行拷贝

a = [1, 2]
# 赋值是引用复制
b = a
print(id(a))
print(id(b))

# 结果
# 2526284042440
# 2526284042440

在这里插入图片描述

浅拷贝

浅拷贝:在内存中开辟一个空间,存放这个copy对象的内存地址,是对一个对象的顶层拷贝,拷贝了引用,并没有拷贝内容,其中的数据还是沿用之前的内存地址,因此改变原对象一维数组数据,不会影响新对象数据,改变新对象数据,不会影响原对象数据,但改变原对象中的二维数组数据,新的对象中的数据也会变化,改变新对象中的二维数组数据,原对象中的数据也会变化。可以使用copy.copy对于可变类型进行浅拷贝,但对于不可变类型,不会浅拷贝,仅仅是指向

c = [11, 22, 33]
# 复制引用
d = copy.copy(c)
print(id(c))
print(id(d))
c.append(44)
print(c)
print(d)

# 结果
# 2526283924744
# 2526283768008
# [11, 22, 33, 44]
# [11, 22, 33]

在这里插入图片描述

a = [1, 2]
b = [a, 3, 4, [5, 6]]
c = copy.copy(b)
a = [1, 2]
b = [a, 3, 4, [5, 6]]
c = copy.copy(b)
print(id(b))
print(id(c))
print(id(b[0]))
print((id(c[0])))
print(id(b[1]))
print(id(c[1]))
print(id(b[3]))
print(id(c[3]))
print(id(b[3][0]))
print(id(c[3][0]))

# 结果
# 2596159692872
# 2596159967688
# 2596159967368
# 2596159967368
# 140717135592576
# 140717135592576
# 2596159695240
# 2596159695240
# 140717135592640
# 140717135592640

在这里插入图片描述

a = [1, 2]
e = (11,a)
f = copy.copy(e)
print(id(e))
print(id(f))
print(e)
print(f)

e[1].append(3)
print(id(e[1]))
print(id(f[1]))
print(e)
print(f)


# 结果
1424684891016
1424684891016
(11, [1, 2])
(11, [1, 2])

在这里插入图片描述

深拷贝

深拷贝:在内存中开辟一个空间,将原对象及其中的可变数据重新创建一份(如果不可变对象中的数据存在可变对象,则外层不可变对象也会复制),深拷贝是递归拷贝,全部复制。不可变数据则沿用原对象的存储引用,这样对原对象中可变数据进行的操作不会影响到新的对象。使用deepcopy()执行深拷贝

a = [1, 2]
b = [a, 3, 4, (5, 6)]
c = copy.deepcopy(b)
print(id(b))
print(id(c))
print(id(b[0]))
print((id(c[0])))
print(id(b[0][0]))
print(id(c[0][0]))
print(id(b[1]))
print(id(c[1]))
print(id(b[3]))
print(id(c[3]))
print(id(b[3][0]))
print(id(c[3][0]))

# 结果
# 2700086094280
# 2700086091912
# 2700086366408
# 2700086366536
# 140717576387648
# 140717576387648
# 140717576387712
# 140717576387712
# 2700082908488
# 2700082908488
# 140717576387776
# 140717576387776

在这里插入图片描述

a = [11,12]
b = (a,)
c = [b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
print(id(c[0][0]))
print(id(d[0][0]))
print(id(c[0][0][0]))
print(id(d[0][0][0]))

# 结果
# 1601607510536
# 1601607508168
# 1601603823752
# 1601605518024
# 1601607782536
# 1601607663688
# 140717917568384
# 140717917568384

在这里插入图片描述

b = (11,)
c = [b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
print(id(c[0][0]))
print(id(d[0][0]))

# 结果
# 3075513143496
# 3075512871496
# 3075509250184
# 3075509250184
# 140717917568384
# 140717917568384

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值