Python中的赋值,浅拷贝和深拷贝的区别

赋值

内存地址的引用,所有的改变都会同步

测试代码

 
 
  1. #coding:utf-8
  2. import copy
  3. a=['a','b',1,[1,2,3]]
  4. b = a #对象赋值,所有改动都会联动
  5. a.append('d')
  6. a[0]='aaa'
  7. a[3].append(4)
  8. print a
  9. print b

运行结果

 
 
  1. ['aaa', 'b', 1, [1, 2, 3, 4], 'd']
  2. ['aaa', 'b', 1, [1, 2, 3, 4], 'd']

浅拷贝

str,num等深浅拷贝都一样,list、dict可变类型 浅拷贝后都用以前的内存地址

测试代码

 
 
  1. #coding:utf-8
  2. import copy
  3. a=['a','b',1,[1,2,3]]
  4. b = copy.copy(a) #浅拷贝,复制了a,b,1的地址引用,对于可变量list、dict,浅拷贝后内存引用地址不变
  5. a.append('d') #对第一层元素新增对象,因为没有被拷贝,不会影响到b
  6. a[0]='aaa' #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
  7. a[3].append(4) #liest和dict为可变量,对list的修改,会影响到b
  8. print a
  9. print b

运行结果

 
 
  1. ['aaa', 'b', 1, [1, 2, 3, 4], 'd']
  2. ['a', 'b', 1, [1, 2, 3, 4]]

一般使用list切片,set等都为浅拷贝操作

深拷贝

str,num等深浅拷贝都一样,list、dict可变类型 深拷贝后会引用新生成的内存地址

测试代码

 
 
  1. #coding:utf-8
  2. import copy
  3. a=['a','b',1,[1,2,3]]
  4. b = copy.deepcopy(a) #深拷贝,复制了a,b,1等不可变类型的地址引用,对于可变量list、dict,深拷贝后引用的是新的内存地址
  5. a.append('d') #对第一层元素新增对象,因为没有被拷贝,不会影响到b
  6. a[0]='aaa' #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
  7. a[3].append(4) #liest和dict为可变量,深拷贝后,b中的list为新的内存地址,所以不会影响到b
  8. print a
  9. print b

运行结果

 
 
  1. ['aaa', 'b', 1, [1, 2, 3, 4], 'd']
  2. ['a', 'b', 1, [1, 2, 3]]

总结

  • 对于两个变量需要联动一致的情况,可以使用赋值操作。
  • 对于拷贝后,对于list、dict类型数据需要联动的情况,可以使用copy浅拷贝,如list数据的共享情况
  • 对于拷贝后,对于list、dict类型数据需要进行独立的拷贝,不受影响,可以使用deepcopy深拷贝,类似获取某个时刻数据的分支副本,可使用deepcopy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值