python数据类型的深浅拷贝

34c206111653dace30fceca92869acda.png

点击上方蓝字关注我哦

455c4cc525ea00c5a94d7337ef43c9fe.png首先要了解什么是拷贝、浅拷贝、深拷贝?

75d832de1577ae5ba553401390611367.jpeg

7e353d40ade926da6cbeb05582d240ea.png

bf07823881e73560c5837339486edf64.png

                            9c61f3a3ee3caf500f08cbf4cf44e693.png

    拷 贝:  

  从原始数据复制一份出来,当复制成功后,这两份数据都是相互独立的,即修改任意一份数据都不会影响另一份数据。

    浅拷贝:

 python中,浅拷贝就是只是拷贝最外层的类型,简单来讲就是拷贝了引用,并没有拷贝内容. copy.copy()

  深拷贝:

 对于一个对象所有层次的拷贝(递归拷贝)copy.deepcopy()

3b06b7be48743b9012aceb65d89a5883.png

404312cae9e37e01a779f59f0bfcb2c3.png 要知道深浅拷贝的区别,首先要知道python中什么是 可变数据类型 和 不可变数据类型

01

4dfa99f731ea51bc46330dfe807aeb81.jpeg

不可变数据类型的定义:

 python中的不可变数据类型,值发生改变,id也改变

python中 不可变数据类型:
  • 整型

  • 浮点数

  • 布尔值

  • 字符串

  • 元组

可变数据类型的定义:

 可变数据类型,值改变,但是id可以不变

python中 可变数据类型:

  • 列表

  • 字典

  • 集合

12a354e635f12cb41f3c984aefd35f89.png通过python中数据类型的分类,我们谈论以下几种的拷贝:

02

a88d54c5d730fa20e400475c1eb8f0bb.gif

不可变数据类型:

赋值

浅拷贝

深拷贝

可变数据类型:

赋值

浅拷贝

深拷贝

092cc42239eaca9506e11d1b2b187712.png不可变数据类型

1a99b7dd6b149c5f21cdcbf2715cd840.jpeg

不可变数据类型赋值:不改变值

只是进行了值的传递给不同的变量名,还在同一个空间

a1 =  1

print(id(a1))

a2 = a1

print(id(a2))

结果:

1867822144

1867822144

改变值

只能进行赋值操作才能改变改值,以整型举例

a1 =  1

print(id(a))

# 要想改变a的值,那就只能赋值,而进行赋值操作就已经改变了id

a1 = 2 

print(id(a))

结果:

1867822144

1867822176

484124a90fef347a57eacbc60358753b.png

不可变数据类型浅拷贝

使用copy模块的copy()方法

import copy

a1 = 3.14

a2 = copy.copy(a1)

print(id(a1), id(a2))

# 输出结果

1698640564680 1698640564680

结论

通过使用copy模块里的copy()函数来进行浅拷贝,把a1拷贝一份赋值给a2,查看输出结果发现,a1和a2的内存地址还是一样。

50a2a28242b3dba0e3d79ecf2efa94ea.png可变数据类型

6acd1604627a87be64f19e6ab88a4657.jpeg

可变数据类型赋值:

a1 = [1,2,3,4]

a2 = a1

print(id(a1),id(a2))

# 输出结果 不改变id

2805765390984 2805765390984

可变数据类型浅拷贝:

调用列表的方法copy()

a  = [1,2,3,4]

a1 = [1,2,3,4,a]

a2 = a1.copy()

print(id(a1),id(a2))

# 输出的外层id发生了改变

2943074293576 2943074291912

print(id(a1[4]),id(a2[4]))

# 输出的内层id没有发生了改变

2943073469064 2943073469064

没有实现真正的拷贝,内层的元素会让拷贝后的列表受到影响

可变数据类型深拷贝:

导入模块copy,使用方法deepcopy()

import copy

a  = [1,2,3,4]

a1 = [1,2,3,4,a]

a2=copy.deepcopy(a1)

print(id(a1),id(a2))

# 输出结果 外层id改变

1929499550024 1929499551304

print(id(a1[4]),id(a2[4]))

# 输出结果 内层也id改变

1929499549832 1929499551240

实现真正的拷贝,内层的元素不会让拷贝后的列表受到影响

9a6e5ae081cef55331d5c9f633e6fc1b.png

END

05b5e125f6282a594a177427da0605eb.png

d9e4f46e6df47cc48ae540997a11917a.png

256b9e48de3f5009289ec737cb4d4482.png

扫码关注我们呗6f8d28bc4a784eb3c61cf3a7657025fe.png4c0d9e48f063d0fb7ee44f8ec20bff9f.png

71b63dfea46b1388c68235a1e2d86b05.png

1756eb66e24f0bf550a5c659efbe8732.png

我就知道你“在看”

2ea6a724fc92192d335c72750b2dbaab.gif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值