python:copy()和deepcopy()区别

1.对象的赋值 

都是进行对象引用(内存地址)传递,即‘’ b is a‘’ ,a 变 b 也变

2.copy.copy(x):浅拷贝

会创建一个新的对象,即 “b is not a” ,但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”b[i] is a[i]”

当我们使用下面的操作的时候,会产生浅拷贝的效果:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数
alist=[1,2,3,["a","b"]]
import copy
a =  copy.copy(alist)
 
a.append("ouyoung")
print('alist:',alist)
print('a:',a)
 
alist.append( '6959')
print('alist:',alist)
print('a:',a)
 
print( id(alist),'*****',id(a)) 
 
 
alist[3].append('cccc')
print('alist:',alist) 
print('a:',a)   # 此处 操作元数据的子对象    发生改变
 
**********************************************************************
 
alist: [1, 2, 3, ['a', 'b']]
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
alist: [1, 2, 3, ['a', 'b'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
2186852331656 ***** 2186853059016
alist: [1, 2, 3, ['a', 'b', 'cccc'], '6959']
a: [1, 2, 3, ['a', 'b', 'cccc'], 'ouyoung']

3.copy.deepcopy(x[, memo]):深拷贝

会创建一个新的对象,即”b is not a” ,并且 对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)

拷贝的特殊情况

其实,对于拷贝有一些特殊情况:

  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝
alist=[1,2,3,["a","b"]]
import copy
a =  copy.deepcopy(alist)
 
a.append("ouyoung")
print('alist:',alist)
print('a:',a)
 
alist.append( '6959')
print('alist:',alist)
print('a:',a)
 
print( id(alist),'*****',id(a)) 
 
 
alist[3].append('cccc')
print('alist:',alist) 
print('a:',a)   # 此处 操作元数据的子对象    没有发生改变
***********************************************************
alist: [1, 2, 3, ['a', 'b']]
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
alist: [1, 2, 3, ['a', 'b'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']
2186853059016 ***** 2186853493960
alist: [1, 2, 3, ['a', 'b', 'cccc'], '6959']
a: [1, 2, 3, ['a', 'b'], 'ouyoung']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值