【Python程序开发】【进阶】Python深浅拷贝

本文详细解释了Python中的浅拷贝和深拷贝概念,指出它们的区别在于处理可变类型和不可变类型的变化。浅拷贝仅复制引用,而深拷贝会递归复制整个对象。通过实例展示了两者在不同情况下的行为。

Python深浅拷贝

拷贝/浅拷贝/深拷贝 只针对可变数据类型

拷贝(赋值)

当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化

简单的赋值
lt = [1, 2, 3]
lt2 = lt

lt.append(4)
print(lt)
# 因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化
print(lt2)

浅拷贝

当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型和变化,lt2不变化

copy.copy()

#lt2没有变化的情况
lt = [1, 2, 3]
lt2 = copy.copy(lt)

lt.append(4)
print(lt)  # [1, 2, 3, 4]
print(lt2)  # [1, 2, 3]


lt2变化的情况
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
lt2 = copy.copy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)

lt.append(4)
print(lt)  # [1, 2, 3, [4, 5, 6], 4]
print(lt2)  # [1, 2, 3, [4, 5, 6]]

lt[-1].append(7)
print(lt)  # [1, 2, 3, [4, 5, 6, 7]]
print(lt2)  # [1, 2, 3, [4, 5, 6, 7]]


lt[0] += 1
print(lt)
print(lt2)

深拷贝

当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变

copy.deepcopy()


import copy
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
lt2 = copy.deepcopy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)

lt.append(4)
print(lt)
print(lt2)

lt[-1].append(7)
print(lt)
print(lt2)

rint(‘*’ * 50)

lt.append(4)
print(lt)
print(lt2)

lt[-1].append(7)
print(lt)
print(lt2)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值