python篇-10-浅拷贝和深拷贝(图文详解)

总结

首先我们要明确一下:变量存储在内存,对象存储在内存。

浅拷贝:

  • 不拷贝子对象的内容,只拷贝子对象的引用
  • 可以使用Python内置函数copy()

深拷贝:

  • 会连子对象的内存全部拷贝一份,对子对象的修改不会影响源对象
  • 可以使用Python内置函数deepcopy()

详细讲解:

简述
在使用Python语言,通常都会面临对象赋值、参数传递的使用,为了更深入理解它们的底层原理。Python也像其他语言如Java一样引入了浅考本和深拷贝的概念。

首先我们要明确一下:变量存储在栈内存,对象存储在堆内存。

Python数据类型分为可变数据类型不可变数据类型

  • 可变数据类型包括:List(列表)、Dictionary(字典)、Set(集合)
  • 不可变数据类型包括:String(字符串)、Number(数字)、Tuple(元组)

浅拷贝:

  1. 不拷贝子对象的内容,只拷贝子对象的引用
  2. 可以使用Python内置函数copy(),

实例如下
a = [(10, 20), [30, 40]]
c = copy.copy(a)
print(id(a), id(c))  # 地址不相同
print(id(a[0]), id(c[0]))  # 嵌套元组地址是一样的
print(id(a[1]), id(c[1]))  # 嵌套列表地址是一样的
结果
2029353023040 2029353022784
2029350906432 2029350906432
2029353058368 2029353058368

 

深拷贝:

  1. 会连子对象的内存全部拷贝一份,对子对象的修改不会影响源对象
  2. 可以使用Python内置函数deepcopy()

实例如下
a = [{10, 20}, [30, 40]]
c = copy.deepcopy(a)
print(id(a), id(c))  # 地址不相同
print(id(a[0]), id(c[0]))  # 嵌套集合地址是不一样的
print(id(a[1]), id(c[1]))  # 嵌套列表地址是不一样的
结果:

2029666940480 2029666940224
2029666800960 2029666802080
2029666975808 2029666941696

如图

不可变对象中,可以有可变的子对象

t1 = (1, 2, [3, 4])
t1[2].append(5)
print(t1)

结果:(1, 2, [3, 4, 5])

参考:

Python赋值、浅拷贝与深拷贝详解(详细分析)_赋值 浅复制还是深复制 python-CSDN博客

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值