【python】list深浅拷贝

1、结论

赋值 :完全相同
深拷贝:完全独立
浅拷贝:简单独立、复杂相同

2、例子

import copy
b = [1, 2, 3, [4, 5]]
c = copy.deepcopy(b)  # 深拷贝
c[0] = 0
c[-1][-1] = 6
print("深拷贝 完全独立")
print(b)
print(c)
输出:
深拷贝 完全独立
[1, 2, 3, [4, 5]]
[0, 2, 3, [4, 6]]
# 拷贝后,bc两个变量的id相同,改变元素内容后,
# 改哪个,哪个的id变化

# # ##################### 直接赋值,完全相同 ###############################
list_11 = [1, 2, 3, [4, 5]]
list_22 = list_11  # 别名,二维列表相同
list_22[-1][-1] += 1
print("直接赋值 完全相同")
print(list_11)
print(list_22)
输出:
直接赋值 完全相同
[1, 2, 3, [4, 6]]
[1, 2, 3, [4, 6]]
# ############### 工厂函数=浅拷贝=表层独立,深层不独立 ##########################
list_1 = [1, 2, 3, [4, 5]]
list_2 = list(list_1)  # 等价于:list_2 = copy.copy(list_1)
list_2[-1][-1] += 1
list_2[0] -= 1
print("浅拷贝 局部(简单元素)独立")
print(list_1)
print(list_2)
输出:
浅拷贝 局部(简单元素)独立
[1, 2, 3, [4, 6]]
[0, 2, 3, [4, 6]]
# 1、关于地址:经勘察发现 简单元素的地址是连续的,
# 但是复杂子对象[4, 5]不在连续存储区
# 2、copy操作后,由于是可变对象(list可以原地改变),
# 所以list_1、list_2两变量的地址不同,但是内部对应
# 元素的地址都是一样的
# 3、简单元素改变:浅拷贝前后的变量值会发生冲突,
# 故list1变量的所有id都保持改变,list2相应位置地址改变。
# 4、复杂元素改变:浅拷贝在复杂子对象的改变上,
# 两变量没有冲突,故直接原地操作,id均未改变。

3、小结

小结,何谓深浅?
关于深浅拷贝,有点反常识,浅拷贝并不是在浅层相同,而是浅层具有独立性。
深拷贝不是全部拷贝,而是完全独立。所以深浅是指可以独立的程度,
浅拷贝就是浅层独立,深拷贝就是完全独立,如果元素都是简单元素例如一维list那么深浅拷贝效果相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值