Python的深、浅拷贝到底是怎么回事?_python中浅拷贝的说法中,创建了对象的一个新的引用,修改其中任意一个变量都会影响

wilber = copy.copy(will)
print('will>> ', will, id(will))
print('wilber>> ', wilber, id(wilber))
print(‘will的各个元素id>> ‘, [id(ele) for ele in will])
print(‘wilber的各个元素id>>’,[id(ele) for ele in wilber])
print(’—’*30)
will[0] = “Wilber”
will[2].append(“CSS”)
print('will>> ', will, id(will))
print('wilber>> ', wilber, id(wilber))
print('will的各个元素id>> ', [id(ele) for ele in will])
print(‘wilber的各个元素id>>’,[id(ele) for ele in wilber])

will>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’]] 43862024
wilber>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’]] 43861896
will的各个元素id>> [31261392, 493056320, 43862088]
wilber的各个元素id>> [31261392, 493056320, 43862088]

will>> [‘Wilber’, 28, [‘Python’, ‘C#’, ‘JavaScript’, ‘CSS’]] 43862024
wilber>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’, ‘CSS’]] 43861896
will的各个元素id>> [43886384, 493056320, 43862088]
wilber的各个元素id>> [31261392, 493056320, 43862088]


![在这里插入图片描述](https://img-blog.csdnimg.cn/11fad6897fb64078a8a9f4c180d0f925.png)




---


#### 三、深拷贝


跟浅拷贝类似,深拷贝也会创建一个新的对象,  
 这个例子中`”wilber is not will”` 但是,  
 对于对象中的元素,  
 深拷贝都会重新生成一份(有特殊情况,下面会说明),  
 而不是简单的使用原始元素的引用(内存地址)


**深拷贝:**


创建一个新的对象,  
 并且递归的复制它所包含的对象  
 (修改其中一个,另外一个不会改变)  
 {copy模块的deep.deepcopy()函数}



import copy
will = [“Will”, 28, [“Python”, “C#”, “JavaScript”]]
wilber = copy.deepcopy(will)
print('will>> ', will, id(will))
print('wilber>> ', wilber, id(wilber))
print(‘will的各个元素id>> ‘, [id(ele) for ele in will])
print(‘wilber的各个元素id>>’,[id(ele) for ele in wilber])
print(’—’*30)
will[0] = “Wilber”
will[2].append(“CSS”)
print('will>> ', will, id(will))
print('wilber>> ', wilber, id(wilber))
print('will的各个元素id>> ', [id(ele) for ele in will])
print(‘wilber的各个元素id>>’,[id(ele) for ele in wilber])

输出为

will>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’]] 37373960
wilber>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’]] 37373832
will的各个元素id>> [31195856, 493056320, 37374024]
wilber的各个元素id>> [31195856, 493056320, 37373768]

will>> [‘Wilber’, 28, [‘Python’, ‘C#’, ‘JavaScript’, ‘CSS’]] 37373960
wilber>> [‘Will’, 28, [‘Python’, ‘C#’, ‘JavaScript’]] 37373832
will的各个元素id>> [37398264, 493056320, 37374024]
wilber的各个元素id>> [31195856, 493056320, 37373768]


#### 四、特殊情况


对于非容器类型  
 (如数字、字符串、和其他’原子’类型的对象)  
 没有拷贝这一说  
 也就是说,  
 对于这些类型,  
 `”obj is copy.copy(obj)” 、”obj is copy.deepcopy(obj)”`  
 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子


![在这里插入图片描述](https://img-blog.csdnimg.cn/210a5818bf7742a3beb55648961d4393.png)



import copy
books=(‘a’,‘b’,‘c’)
books1,books2 = copy.copy(books),copy.deepcopy(a)

books is books1 is books2

true

a = ‘python’
b,c = copy.copy(a),copy.deepcopy(a)
In [19]: a is b is c
Out[19]: True
In [20]: id(a),id(b),id©
Out[20]: (55466056, 55466056, 55466056)

In [30]: t1=(‘a’,‘b’,‘c’,[‘d’])

In [31]: t2,t3 = copy.copy(t1),copy.deepcopy(t1)

In [32]: t1 is t2 is t3
Out[32]: False

In [33]: id(t1), id(t2), id(t3)
Out[33]: (89247560, 89247560, 88537672)


Python中对象的赋值都是进行对象引用(内存地址)  
 传递  
 使用copy.copy(),  
 可以进行对象的浅拷贝,  
 它复制了对象,但对于对象中的元素,  
 依然使用原始的引用.  
 如果需要复制一个容器对象,  
 以及它里面的所有元素(包含元素的子元素),  
 可以使用copy.deepcopy()进行深拷贝  
 对于非容器类型  
 (如数字、字符串、和其他’原子’类型的对象)  
 没有被拷贝一说  
 如果元祖变量只包含原子类型对象,则不能深拷贝


**1.列表的浅拷贝示例**



import copy
a = [1,2,3,4,[‘a’,‘b’]] #定义一个列表a
b = a #赋值
c = copy.copy(a) #浅拷贝
d = copy.deepcopy(a) #深拷贝
a.append(5)
a[0] = ‘10’
print(‘A0’,a,id(a))

[1, 2, 3, 4, [‘a’, ‘b’], 5] #a添加一个元素5

print(‘B0’,b,id(b))

[1, 2, 3, 4, [‘a’, ‘b’], 5] #b跟着添加一个元素5

print(‘C0’,c,id©)

[1, 2, 3, 4, [‘a’, ‘b’]] #c保持不变

print(‘D0’,d,id(d))

[1, 2, 3, 4, [‘a’, ‘b’]] #d保持不变

a[4].append(‘c’)
a[4][1]=‘ASDF’
print(‘A1’,a,id(a))

[1, 2, 3, 4, [‘a’, ‘b’, ‘c’], 5] #a中的list(即a[4])添加一个元素c

print(‘B1’,b,id(a))

[1, 2, 3, 4, [‘a’, ‘b’, ‘c’], 5] #b跟着添加一个元素c

print(‘C1’,c,id©)

[1, 2, 3, 4, [‘a’, ‘b’, ‘c’]] #c跟着添加一个元素c

print(‘D1’,d,id(d))
[1, 2, 3, 4, [‘a’, ‘b’]] #d保持不变


**2.单个列表的copy**



names = [‘alex’,‘jack’,‘1’,‘mack’,‘racheal’,‘shanshan’]
n2 = names
n3 = names.copy()
n4 = names[:]

print(‘第一轮’,‘names’,names,id(names))
print(‘第一轮’,‘n2’,n2,id(n2))
print(‘第一轮’,‘n3’,n3,id(n3))
print(‘第一轮’,‘n4’,n4,id(n4))

names.append(‘hery’)
names[0]=“Alex”
print(‘第二轮’,‘names’,names,id(names))
print(‘第二轮’,‘n2’,n2,id(n2))
print(‘第二轮’,‘n3’,n3,id(n3))
print(‘第二轮’,‘n4’,n4,id(n4))


**输出:**



第一轮 names [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167690376
第一轮 n2 [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167690376
第一轮 n3 [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167692616
第一轮 n4 [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167713928
第二轮 names [‘Alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’, ‘hery’] 167690376
第二轮 n2 [‘Alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’, ‘hery’] 167690376
第二轮 n3 [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167692616
第二轮 n4 [‘alex’, ‘jack’, ‘1’, ‘mack’, ‘racheal’, ‘shanshan’] 167713928


**3.字符串的copy**



import copy
name=“hahah” #字符串
name1=copy.copy(name)
name2=copy.deepcopy(name)
print(‘第一次’,id(name),id(name1),id(name2))

sum=111 #数字
sum1=copy.copy(sum)
sum2=copy.deepcopy(sum)
print(‘第二次’,id(sum),id(sum1),id(sum2))


**输出:**



第一次 31179752 31179752 31179752
第二次 1702001568 1702001568 1702001568


**4.字典的copy**



import copy
call = {
‘cpu’:[80,25],
‘mem’:[80,],
‘disk’:[80,]
}
new_call_1 = copy.copy(call)
new_call_2 = copy.deepcopy(call)
print(‘修改前call1为:%s’ %(call),id(call))

#修改新模版

call[‘disk’] = 66
call[‘disk_2’] = 67
call[‘cpu’].append(20)
call[‘cpu’][1]=11
new_call_1[‘cpu’].append(33)
new_call_1[‘disk’][0] = 77
new_call_1[‘mem’] = 75
new_call_2[‘disk’][0] = 79

#查看新旧模版的值

print(‘call1为:%s’ %(call),id(call))
print(‘new_call_1为:%s’ %(new_call_1),id(new_call_1))
print(‘new_call_2为:%s’ %(new_call_2),id(new_call_2))


**输出:**



修改前call1为:{‘cpu’: [80, 25], ‘mem’: [80], ‘disk’: [80]} 4411328
call1为:{‘cpu’: [80, 11, 20, 33], ‘mem’: [80], ‘disk’: 66, ‘disk_2’: 67} 4411328
new_call_1为:{‘cpu’: [80, 11, 20, 33], ‘mem’: 75, ‘disk’: [77]} 4452424
new_call_2为:{‘cpu’: [80, 25], ‘mem’: [80], ‘disk’: [79]} 31977616


##### Python 打印进度条




如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费**学习**大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。



### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

### 二、学习软件



工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

![](https://img-blog.csdnimg.cn/img_convert/eec417a3d4d977b313558a11d3c13e43.png)



### 四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/img_convert/ec690501ea1dbe2cb209cbf4013c2477.png)  

![](https://img-blog.csdnimg.cn/img_convert/3eaeaa6747419c9d86c72e0d10d0a6a2.png)



### 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。



![](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)



### 五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

![](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值