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