Python-学习笔记-赋值和浅复制与深复制(copy&deepcopy)

Python-学习笔记-赋值和浅复制与深复制(copy&deepcopy)

# -*- coding:utf-8 -*-

####################################################################################
#
#               python序列分为 容器序列 和 扁平序列
#
#
#               另一种维度上分为 可变序列 和 不变序列
#
#                   不变序列有3:tuple、set、bytes
#
#                   可变序列有: list、array.array、array.bytearray、memoryview
#
####################################################################################

# 简介:python序列复制分为 1.不可变序列赋值(普通) 2.可变元素单维度复制(浅复制) 3.可变元素多维度复制(深复制)
# 浅复制和深复制只适合于可变序列 也就是内存值会发生变化的序列

# 1. 普通序列赋值(只是挂载引用)
# 1.1 不变序列
print('\nNormal Voluation(create new memery):')
x = 1
y = x
x = 2
print(x)  # 2 指向新内存地址
print(y)  # 1 指向旧内存地址

# 1.2 可变序列(产生问题 - 需要使用浅复制)
lst01 = [1, 2, 3]  # 原始内存
lst02 = lst01  # 赋值引用关系
lst01[2] = 4  # 原始可变序列变化
print('\nNormal Voluation(old memery):')
print(lst01)  # 指向 原始内存
print(lst02)  # 指向 原始内存 - 发现lst02[2]也变成了4, 因为lst02引用lst01

# 2.浅复制 obj.copy()
# 2.1 一维度浅复制(元素项为不可变序列)
lst01 = [1, 2, 3]
lst02 = lst01.copy()  # 新创建对象 新内存
lst01[2] = 4
print('\nCopy - One Dimension:')
print(lst01)  # [1,2,4]
print(lst02)  # [1,2,3]

# 2.2 多维度浅复制(浅复制问题 - 需要使用深复制)
# 多维内部 如果有可变序列子项,外部是浅复制,内部子项依旧是引用
lst01 = [1, 2, [3, 4]]
lst02 = lst01.copy()  # 新创建对象 新内存
lst01[2][1] = 3  # [3,4]为一维列表中的一个元素 复制时候采取引用复制的方式
print('\nCopy - Multi Dimensions:')
print(lst01)  # [1, 2, [3, 3]]
print(lst02)  # [1, 2, [3, 3]]

# 3. 深复制 copy.deepcopy(obj)
# 3.1 N维度序列均重新生成 无任何旧源引用
import copy

lst01 = [1, 2, [3, 4]]
lst02 = copy.deepcopy(lst01)  # 新创建对象 新内存,任何子维度的元素项全部依次使用copy()创建新对象 没有任何源序列引用关系
lst01[2][1] = 3
print('\nDeepcopy:')
print(lst01)  # [1, 2, [3, 3]]
print(lst02)  # [1, 2, [3, 4]]

总结:不变序列直接用,可变序列看维度,一维直接浅复制,多维得用深复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值