python之浅拷贝、深拷贝

什么是浅拷贝、深拷贝: ———理论来自python基础教程

在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。

在 Python 中,为了使当进行赋值操作时,两个变量互不影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。

1、直接赋值

特点:父值与子值之间会随着一个值的改变而改变

标识id值一样

a=[1,2,3,4,5,[6,7]]
b=a
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))

result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [2, 2, 3, 4, 5, [6, 8]]
[3, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
35769480
35769480

2、浅拷贝—copy

特点:父值与子值之间在某种情况下会随着一个值的改变而改变(嵌套值会改变,如下)

子值改变则父值不改变(嵌套值还是会改变,如下)

标识id值不一样

import copy
a=[1,2,3,4,5,[6,7]]
b=a.copy()           #这里可以使a.copy()或者copy.copy(a)
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))


result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 8]]
[2, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
40750152
40750472
a=[1,2,3,4,5,[6,7]]
b=a[:]
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))


result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 8]]
[2, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
40684360
40684680

3、深拷贝—deepcopy

特点:父值与子值之间互不相关,不会随着一个值改变而改变

标识id值不一样

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


result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [3, 2, 3, 4, 5, [6, 9]]
40356744
40357064

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值