如何理解浅拷贝 深拷贝 以及常见的赋值

1.赋值

Python 中,对象的赋值就是简单的对象引用

a = [1,2,"hello",['python', 'C++']]
b = a

 他们指向同一片内存,b 不过是 a 的别名,是引用

 

 

2.我们可以使用 b is a 去判断,返回 True,表明他们地址相同,内容相同,也可以使用 id()函数来查
看两个列表的地址是否相同.

 

赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。也就是
说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响
了 a。

 

二、浅拷贝(copy.copy)

是拷贝了一份和原来一样的的变量 ,但是他们指向的是不同的内存地址  ,虽说如此 ,浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。

我们举个例子

a=[1,2]
b=[3,4]
l=[a,b]
#如果我们浅拷贝了一份 l  那么新的变量是否就是 l呢
import  copy
l2=copy.copy(l)
print(l2 is l )
>>>flase
#当然是否定的

当我们在a里添加了一个时
a.append(0)
print(l)
print(l2)
会发现l,l2都变了 所以 浅拷贝的第一层是对象的应用

我们在1之后添加一个索引 会发现不影响l2
import  copy
l2=copy.copy(l)
l.append(3)
print(l2)

切片后赋值 ,list  copy方法都是浅拷贝

三深拷贝

那我们再看下深拷贝

import copy
l2=copy.deepcopy(l)
print(l[0] is a )#True
print(l2[0] is a )#False

总结 :浅拷贝和深拷贝

如果被拷贝的类型是可变类型 比如列表 

copy 是浅拷贝,decopy的深拷贝

如果被拷贝类型是不可变类型分为两种情况  (a,b)

 1.里面那一层 如果是不可变的 那么copy 是引用,deepcopy也是引用  (1,2)

  2.里面那一层 如果是可变的  copy 是引用 ,deepcopy是深拷贝   ([1],[2])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值