[Python]之深拷贝与浅拷贝

Python之深拷贝与浅拷贝

概述:

​ 大白话解释就是 深拷贝拷贝的多, 浅拷贝拷贝的少.

  1. 深浅拷贝区别就是: 拷贝的层级的多与少.

  2. 深浅拷贝都能操作可变类型 和 不可变类型, 但是深浅拷贝一般操作的都是 可变类型, 几乎不会出操作不可变类型的.

  3. 可变类型 和 不可变类型的划分依据: 在不改变地址值的情况下, 元素值是否可以发生改变,

    可以: 可变类型, 不可以: 不可变类型.
    ​ 可变类型: 列表, 字典, 集合
    ​ 不可变类型: 整型, 浮点型, 字符串, 布尔型, 元组

  4. 深浅拷贝指的是 copy模块下的不同的函数.
    ​ 浅拷贝: copy.copy()
    ​ 深拷贝: copy.deepcopy()

因为深浅拷贝主要针对的是可变类型,不可变类型拷贝还是同一个地址,所以下面通过一个简单的方式讲明白深浅拷贝的区别
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = c
print(id(c))
print(id(d))

​ 当上面的代码执行后,我们发现c和d的地址是一样的,因为在python中 = 传递的是地址值,又因为python中list为可变类型,更改值并不会变更地址,所以,更改c的值的时候d的值也会被更改,那么如果我们想更改c而不更改d的时候怎么办呢?

这个时候就需要浅拷贝了
import copy

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

​ 此时我们发现,d和c的地址值不一样了,浅拷贝将一个新的地址值给了d并将c的内容加进去了

​ 这个时候我们修改c,d里面除了a,b列表以外的值都不会有关联,但是,因为是浅拷贝,c d 里面复制的是ab的地址,这个时候修改c或d里面a,b的值,都会影响到另一个,可能会看不懂,这里代码试一下就明白了:

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.copy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)

运行结果如下:

在这里插入图片描述

这时聪明的小伙伴就理解了,深拷贝是将拷贝对象内部的地址内的内容也拷贝到新的地址

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)

这个时候修改c内a的值就不会影响到d了

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值