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]]

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章