Python深浅拷贝

【一】深浅拷贝定义

【1】浅拷贝

  • 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象

【2】深拷贝

  • 深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存

【二】对比理解

请添加图片描述

  • 浅拷贝
    • 简单理解:文件系统的快捷方式
    • 仅仅复制了中间的内存地址
    • 只会复制一层,如果copy的对象中有可变数据类型(如列表、字典等),修改可变数据类型还会影响拷贝的对象
    • 是一种快捷的选项,同时修改
  • 深拷贝
    • 简单理解:文件系统的复制整个文件
    • 不止复制了中间的内存地址,后面变量值也复制了
    • 完整复制,无论可变或不可变,都是创建出新的来,以后再改原对象,都不会对copy出的对象造成影响
    • 是一种更安全的选项

【三】代码理解

(1)复制不可变数据类型

import copy

a = 1
b = copy.copy(a)
print(id(1))
print(a, b)
print(id(a), id(b))
a = 2  # 申请新的内存地址
print(a, b)
print(id(a), id(b))

# 1261540147440
# 1 1
# 1261540147440 1261540147440
# 2 1
# 1261540147472 1261540147440

请添加图片描述

(2)浅拷贝:复制可变数据类型和不可变数据类型

import copy

a = [1, [1]]
b = copy.copy(a)
print(a, b)
print(id(a), id(a[0]), id(a[-1]), id(a[-1][0]))
print(id(b), id(b[0]), id(b[-1]), id(b[-1][0]))

# [1, [1]] [1, [1]]
# 2994145585344 2994141659376 2994145588544 2994141659376
# 2994145585600 2994141659376 2994145588544 2994141659376

请添加图片描述

a[0] = 2
a[-1][0] = 2
print(a, b)
print(id(a), id(a[0]), id(a[-1]), id(a[-1][0]))
print(id(b), id(b[0]), id(b[-1]), id(b[-1][0]))

# [2, [2]] [1, [2]]
# 2994145585344 2994141659408 2994145588544 2994141659408
# 2994145585600 2994141659376 2994145588544 2994141659408

请添加图片描述

(3)深拷贝:复制可变数据类型,修改内部的不可变数据类型

a = [1, 2, 3, 4]
b = [a, a, a]
b_copy = copy.deepcopy(b)
b[1][1] = 100
print(b)
print(b_copy)
# [[1, 100, 3, 4], [1, 100, 3, 4], [1, 100, 3, 4]]
# [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
  • 原始内容和深拷贝内容不一样,因为深拷贝以后已经是两块不同的数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值