1_python进阶—浅拷贝、深拷贝

一、内存地址

内存:

左边:变量或者引用

右边:对象,数据

lst1 = ["小王", "小明", "小黑", "小花"]
lst2 = lst1 # 列表, 进行赋值操作. 实际上是引用内存地址的赋值. 内存中此时只有一个列表. 两个变量指向一个列表

lst2.append("小红")  # 对期中的一个进行操作. 两个都跟着变
print(lst2)
print(lst1)


#  结果
["小王", "小明", "小黑", "小花", "小红"]
["小王", "小明", "小黑", "小花", "小红"]

print(id(lst1),id(lst2))  # 内存地址一样

在这里插入图片描述

  • 对于list,set,dict来说,直接赋值。其实是把内存地址交给变量,并不是复制一份内容。
  • 所以,Ist1的内存指向和Ist2是一样的。Ist1改变了,Ist2也发生了改变

二、浅拷贝 copy 创建新对象

创建新对象,内存地址不同

lst1 = ["赵山", "小能", "赵四"]
lst2 = lst1.copy()  # lst2 和lst1 不是一个对象了

print(id(lst1), id(lst2))
#2348178624968 2348178625480

2.1 浅拷贝 copy

lst1 = ["赵山", "小能", "赵四"]
lst2 = lst1.copy()  # lst2 和lst1 不是一个对象了

lst1.append("大脚")

print(lst1, lst2)
print(id(lst1), id(lst2))

# ['赵山', '小能', '赵四', '大脚'] ['赵山', '小能', '赵四']
# 1221664068040 1221664068552

在这里插入图片描述

2.2 浅拷贝 [:]

lst1 = ["赵山", "小能", "赵四"]
lst2 = lst1[:]  # 切片会产生新的对象,从头到尾

lst1.append("大脚")
print(lst1, lst2)
print(id(lst1), id(lst2))

# ['赵山', '小能', '赵四', '大脚'] ['赵山', '小能', '赵四']
# 2843786826184 2843786826696

三、深拷贝

3.1 浅拷贝问题

lst1 = ["超人", "七龙珠", "葫芦娃", "山中小猎人", ["金武", "王宏", "渣渣"]]
lst2 = lst1.copy()  # 浅拷贝,拷贝第一层(内部不会再复制)

lst1[4].append("大阳哥")
print(lst1)
print(lst2)

# ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金武', '王宏', '渣渣', '大阳哥']]
# ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金武', '王宏', '渣渣', '大阳哥']]

在这里插入图片描述

结果:
两个1st完全不一样。内存地址和内容也不一样。发现实现了内存的拷贝。

3.2 深拷贝

import copy
lst1 = ["超人", "七龙珠", "葫芦娃", "山中小猎人", ["金武", "王宏", "渣渣"]]

lst2 = copy.deepcopy(lst1)  # 把lst1扔进去进行深度拷贝 , 包括内部的所有内容进行拷贝
lst1[4].append("大阳哥")
print(lst1, lst2)

# ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金武', '王宏', '渣渣', '大阳哥']]
# ['超人', '七龙珠', '葫芦娃', '山中小猎人', ['金武', '王宏', '渣渣']]
  • 都不一样了。
  • 深度拷贝:把元素内部的元素完全进行拷贝复制。不会产生一个改变另一个跟着改变的问题

四、为什么要有深浅拷贝

  • 创建对象是类实例化的一个过程,先开内存,然后往里面写东西
  • 拷贝比创建对象的过程要快
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少云清

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

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

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

打赏作者

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

抵扣说明:

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

余额充值