目录
前言
有时候我们在处理数据的时候,希望保持原有数据不变,就用另外一个变量名去接收,其实这种操作是没用的,还是会改变原有的数据,里的深复制和浅复制可以完美解决这个问题。
任务
在 中,对象的分配和复制有所区分。
变量名=值,会在内存中创建一个地址来存放这个值,有时候我们是通过变量名来赋值的,这种情况下其实就是一个共享内存地址,如下图。
# 内存共享 列表属于可变类型
a = [1, 2, 3, 4]
# 将 a 赋值给 b
# 共享内存地址
b = a
# 改变a中的值
a[1] = 5
# a,b都改变了 内存地址没变
print(a,id(a))
print(b,id(b))
# 实际上是对同一个数据进行修改。
这里要提醒一下,列表是可变类型,修改其中的值不会创建新的内存地址。但是对于不可变类型就不同了,修改其中一个值,会创建新的内存地址来存储修改后的数据,原有的数据不会受到影响。
a = 'asd'
# 将 a 替换为d
c = a.replace('a','d')
# 内存地址改变了
print(a,id(a))
print(c,id(c))
所以这里说的深复制与浅复制都是针对可变数据类型的。
复制
复制就是将数据复制一份,修改数据不会互相影响。复制分为浅复制和深复制。
浅拷贝
浅拷贝只复制第一层,即父对象。
# 只拷贝父对象
a = [1, 2, 6, 5]
# 拷贝一份
b = a.copy()
# 修改a数据
a[1] = 5
print('a:', a)
print('b:', b)
# 拷贝的一份b没有改变
如果列表嵌套很深怎么办?
# 嵌套多个
a = [1, 2, [5, 6], [1, 2, 3]]
b = a.copy()
a[2][1] = 2
print('a', a)
print('b', b)
# a [1, 2, [5, 2], [1, 2, 3]]
# b [1, 2, [5, 2], [1, 2, 3]]
# 我们会发现还是一起改变了,因为浅拷贝只拷贝父对象 不会拷贝子对象
深复制
深层复制会创建数据的完全独立副本,并创建一个新的内存地址来存储它,并且完全不共享数据。
# 导入模块
import copy
a = [1, 2, 3, 4, [1, 2, 4]]
# 深拷贝
b = copy.deepcopy(a)
a[-1][0] = 5
# 内存地址不一样
print('a:', a,'id:',id(a))
print('b:', b,'id:',id(b))
总结
浅拷贝只复制第一层,也就是父对象(半共享数据),而深拷贝会复制你拥有的所有对象(数据完全不共享)。
扫一扫在手机端查看
-
Tags : python 只赋值不共用内存
本文链接:https://by928.com/6681.html 转载请注明出处和本文链接!请遵守
《网站协议》
!
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。