python的深拷贝和浅拷贝

import copy
""" 
深拷贝 和 浅拷贝 
相同点:.
1、如果是不可变对象,如:字符串、元组。深拷贝 和 浅拷贝 都不会对原拷贝对象有影响
2、如果是可变对象,且不带子对象,如:列表、字典。深拷贝 和 浅拷贝 都不会对原拷贝对象有影响
3、如果是可变对象,且带子对象,修改不是子对象的内容。深拷贝 和 浅拷贝 都不会对原拷贝对象有影响
不同点:
如果是可变对象,且带子对象,修改子对象的内容。深拷贝不会对原拷贝对象有影响,浅拷贝会修改原拷贝对象内容
"""
print("========================================浅拷贝copy.copy()===============================================")
"""
浅拷贝:
只拷贝容器本身,容器中的元素并未拷贝
第一种:
拷贝对象是可变对象,但是没有复杂子对象
结论:
原来的值改变,不会影响浅复制后的值
"""
a = [1, 2, 3, 4, 5]
b = copy.copy(a)
b.append(6)
print("【浅拷贝】===可变对象,且不带子对象===改变拷贝后的对象", b)  # [1, 2, 3, 4, 5, 6]
print("【浅拷贝】===可变对象,且不带子对象===原对象", a)  # [1, 2, 3, 4, 5]
print("【结论】: 不带复杂子对象的可变对象【浅拷贝】后的对象修改和原对象没有关系\n")

"""
第二种:
拷贝对象中含有复杂子对象
① 修改拷贝对象中不是复杂子对象的内容
② 修改拷贝对象中复杂子对象的内容
结论:
① 修改拷贝对象中不是复杂子对象的内容,不管修改拷贝前还是拷贝后的对象,都不会影响互相影响
② 修改拷贝对象中复杂子对象的内容,同时会修改原来拷贝对象中复杂子对象的值
"""
c = [1, 2, [3, 4, 5]]
d = copy.copy(c)
# 1.修改拷贝对象中不是复杂子对象的内容
d[0] = 2
print("【浅拷贝】===》可变对象===》且带复杂子对象===》修改不是子对象的内容", d)  # [2, 2, [3, 4, 5]]
print("【浅拷贝】===》可变对象===》且带复杂子对象===》原对象", c)  # [1, 2, [3, 4, 5]]
print("【结论】: 带复杂子对象的可变对象【浅拷贝】后【修改非子对象】的内容和原对象没有关系\n")
# 2.修改拷贝对象中复杂子对象的内容
k = copy.copy(c)
k[2][0] = 5
print("【浅拷贝】===》可变对象===》且带复杂子对象===》修改子对象的内容", k)  # [1, 2, [5, 4, 5]]
print("【浅拷贝】===》可变对象===》且带复杂子对象===》原对象", c)  # [1, 2, [5, 4, 5]]
print("【结论】: 带复杂子对象的可变对象【浅拷贝】后【修改子对象】的内容和原对象有关系=====》浅拷贝修改复杂子对象内容,会影响原对象\n")


print("======================================深拷贝copy.deepcopy()============================================")
"""
第一种:拷贝对象是可变对象
"""
# 1.拷贝对象是可变对象
info = [1, 2, 3, 4, 5]
info_copy = copy.deepcopy(info)
info_copy[4] = 88
print("【深拷贝】===》可变对象===》且不带子对象===》改变拷贝后的对象", info_copy)  # [1, 2, 3, 4, 88]
print("【深拷贝】===》可变对象===》且不带子对象===》原对象", info)  # [1, 2, 3, 4, 5]
print("【结论】: 不带复杂子对象的可变对象【深拷贝】后的对象修改和原对象没有关系\n")

"""
第二种:拷贝对象中有复杂子对象
① 修改不是复杂子对象的内容
② 修改复杂子对象的内容
结论:
是否有复杂子对象,深拷贝都无影响
"""
# 1.拷贝对象中含有复杂子对象。修改不是子对象的部分
e = {"name": "zkc", "age": 18, "info": [1, 2, 3, 4, 5]}
f = copy.deepcopy(e)
param = {"age": 20}
f.update(param)
print("【深拷贝】===》可变对象===》且不带子对象===》改变拷贝后的对象", f)  # {'name': 'zkc', 'age': 20, 'info': [1, 2, 3, 4, 5]}
print("【深拷贝】===》可变对象===》且不带子对象===》原对象", e)  # {'name': 'zkc', 'age': 18, 'info': [1, 2, 3, 4, 5]}
print("【结论】: 带复杂子对象的可变对象【深拷贝】后【修改非子对象】的内容和原对象没有关系\n")
# 2.拷贝对象中含有复杂子对象。修改子对象的部分
h = copy.deepcopy(e)
h["info"][0] = 77
print("【深拷贝】===》可变对象===》且带子对象===》改变拷贝后的对象", h)  # {'name': 'zkc', 'age': 18, 'info': [77, 2, 3, 4, 5]}
print("【深拷贝】===》可变对象===》且带子对象===》原对象", e)  # {'name': 'zkc', 'age': 18, 'info': [1, 2, 3, 4, 5]}
print("【结论】: 带复杂子对象的可变对象【深拷贝】后【修改子对象】的内容和原对象没有关系\n")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一位不知名民工

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

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

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

打赏作者

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

抵扣说明:

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

余额充值