import copy
# 浅拷贝:
# 只拷贝顶层,不拷贝子元素
# 顶层可变,修改不可变子元素(不会)影响拷贝后的对象
# 修改可变子元素(会)影响拷贝后的对象(因为浅拷贝不拷贝子元素)
# 顶层不可变,无法修改不可变元素
# 修改可变子元素(会)影响拷贝后的对象(因为浅拷贝不拷贝子元素)
# # 子元素全部不可变元素
# a = [1, 'word', 2]
# b = copy.copy(a)
# print(a, b)
# # 使a[0]指向3
# a[0] = 3 # 改变a[0]后b[0]还是1
# print(a, b)
# # 子元素部分可变
# a = [1, 2, ['hello', 'word']]
# b = copy.copy(a)
# a[0] = 7
# a[2][1] = 'china'
# # a[2][1]改变b[2][1]也改变
# # a[0]改变为7 b[0]不改变还是1
# print(b[0], b[2][1])
# # 顶层是immutable子元素全是immutable
# a = (1, 2, 3)
# b = copy.copy(a)
# # a和b指向同一个元组对象,没有拷贝
# # 顶层是immutable子元素部分mutable
# a = (1, 2, ['hello', 'world'])
# b = copy.copy(a)
# a[2][1] = 'china'
# print(a[2][1], b[2][1]) # 修改a21b21会跟着改变
# # 变量a与b变量b指向相同得元组对象,并且a[2]和b[2]指向同一个列表,
# # 所以修改前一个会影响后一个
# 深拷贝:
# 递归顶层对象,以及它内部的子元素对像
# 顶层可变,修改可变子元素,不会影响另一个(深拷贝拷贝子元素)
# 顶层不可变,有可变子元素,可以拷贝,
# 修改可变子元素,不会影响另一个(深拷贝拷贝子元素)
# 子元素有可变元素就可以深拷贝
# 一旦深拷贝成功,改变a 都不影响 b
# # 顶层是mutable,子元素全是immutable不可变元素
# a = [1000, 'word', 2]
# b = copy.deepcopy(a)
# print(id(a), id(b))
# print([id(item) for item in a])
# print([id(item) for item in b])
# # 变量a与变量b指向不同的列表对象,修改a
# # 只会修改a不会影响b
# # 顶层是mutable,子元素部分不可变
# a = [1, 2, ['hello', 'word']]
# b = copy.deepcopy(a)
# # id(a)不同于id(b)
# a[2][1] = 'china'
# print(a, b)
# 顶层是immutable子元素全是immutable
# 也即父子都是不可变,不管是深拷贝还是浅拷贝都无法拷贝
# # 顶层是immutable,子元素部分mutable
# # 子元素有可变元素可以深度拷贝,
# # 可以深度拷贝,修改a不会影响b
# a = (1, 2, ['hello', 'world'])
# b = copy.deepcopy(a)
# a[2][1] = 'china'
# print(a, b)
# # 输出为(1, 2, ['hello', 'china']) (1, 2, ['hello', 'world'])
# 列表的复制相当于浅拷贝的效果,
# 有以下三种方式:
# 列表的copy()函数
# list()转换函数
# 列表分片[:]
a = [1, 2, ['hello', 'world']]
b = a.copy()
c = list(a)
d = a[:]
print(id(a), id(b), id(c), id(d))
# 四个id不同
a[0] = 100
a[2][1] = 'wangy'
print(a, b, c, d)
# 只有a的第一个元素改为100,而abcd所有的‘world’改为了‘wangy’
# bcd都是a的复制,他们指向不同的列表对象,但是没有拷贝子元素
# a[2]和b[2]c[2]d[2]指向同一个列表,相当于浅拷贝的效果
# 元组的复制相当于浅拷贝
# 使用分片[:]操作
# 字典的复制相当于浅拷贝
# 使用copy()函数或者转换函数dict()
# 集合的复制
# 同列表相似使用copy()函数或者转换函数set()
python基础 深拷贝和浅拷贝总结
最新推荐文章于 2025-06-26 15:34:24 发布