Python中的浅拷贝和深拷贝

本人之前一直在Java中游走,最近人工智能的兴起想必让大多数程序员们春心荡漾,然后自己就开始花时间研究机器学习,深度学习这些东东。语言方面,我的理解是万变不离其宗,只是工具而已。 这是我的第一篇博客,简谈一下Python中深拷贝浅拷贝的一些知识,和JAVA是大同小异。知道会有不成熟的地方,希望大家批评指正。

 

在java中传递(方法/函数)的数据时除了基本类型以及封装类 其他的都是引用

Python可以说传的都是引用

 

浅拷贝含义: 我们只是把我所拥有的对象给拷贝 但是对象里面的 对象引用是拷贝不了的

深拷贝含义: 我们一层一层的拷贝,可以理解为把所有的都一一拷贝下来,之后互不干涉,就是两个独立的对象

 

下面通过代码为大家解读

我首先创建一个学生类,另一个是学科类

学生类里面有姓名属性,还有学科类属性。

在学科类里面定义了学科名称的属性

 

 

1.原始对象的含义就是我创建的对象,克隆对象则是拷贝过后的对象

 

<strong>#导入copy库</strong>
import copy
class student():

    def __init__(self,name,subject):
        self.name = name
        self.subject = subject

class subject():
    def __init__(self,name):
        self.name = name

print("===============浅拷贝===================")
stu = student('liujinyu',subject('CHAIN'))
print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)


<strong>2.然后分别进行拷贝   导入copy库   浅拷贝方法  copy.copy()  深拷贝方法 copy.deepcopy()</strong>
#浅拷贝
stu1=copy.copy(stu)
print("克隆对象地址值","stu:",id(stu1),"sub:",id(stu1.subject))
print("克隆对象属性:",stu1.name,stu1.subject.name)

print("===============修改原始对象的属性值===================")

stu.name='wushouxing'
stu.subject.name='USA'
#print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)


stu1=copy.copy(stu)
print("克隆对象地址值","stu:",id(stu1),"sub:",id(stu1.subject))
print("克隆对象属性:",stu1.name,stu1.subject.name)

print("===============修改原始对象的属性值===================")

stu.name='wushouxing'
stu.subject.name='USA'
#print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)

<strong>3.修改原始对象的属性值后观察  克隆对象地址和属性值的变化 </strong>

#print("克隆对象地址值","stu:",id(stu1),"sub:",id(stu1.subject))
print("克隆对象属性:",stu1.name,stu1.subject.name)


#浅拷贝打印结果
===============浅拷贝===================
原始对象地址值 stu: 2686218897336 sub: 2686218897448
原始对象属性: liujinyu CHAIN
克隆对象地址值 stu: 2686218897728 sub: 2686218897448
克隆对象属性: liujinyu CHAIN
===============修改原始对象的属性值===================
原始对象属性: wushouxing USA
克隆对象属性: liujinyu USA

print("===============深拷贝===================")
stu = student('liujinyu',subject('CHAIN'))
print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)


===============浅拷贝===================
原始对象地址值 stu: 2686218897336 sub: 2686218897448
原始对象属性: liujinyu CHAIN
克隆对象地址值 stu: 2686218897728 sub: 2686218897448
克隆对象属性: liujinyu CHAIN
===============修改原始对象的属性值===================
原始对象属性: wushouxing USA
克隆对象属性: liujinyu USA

print("===============深拷贝===================")
stu = student('liujinyu',subject('CHAIN'))
print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)

4.进行深拷贝.进行深拷贝

stu1=copy.deepcopy(stu)
print("克隆对象地址值","stu:",id(stu1),"sub:",id(stu1.subject))
print("克隆对象属性:",stu1.name,stu1.subject.name)

print("===============修改原始对象的属性值===================")

stu.name='wushouxing'
stu.subject.name='USA'
#print("原始对象地址值","stu:",id(stu),"sub:",id(stu.subject))
print("原始对象属性:",stu.name,stu.subject.name)

#print("克隆对象地址值","stu:",id(stu1),"sub:",id(stu1.subject))
print("克隆对象属性:",stu1.name,stu1.subject.name)
<strong>5.修改原始对象属性值,观察深拷贝过后,克隆对象的地址</strong>

#深拷贝打印结果

===============深拷贝===================
原始对象地址值 stu: 2686218898232 sub: 2686218899184
原始对象属性: liujinyu CHAIN
克隆对象地址值 stu: 2686218898288 sub: 2686218899128
克隆对象属性: liujinyu CHAIN
===============修改原始对象的属性值===================
原始对象属性: wushouxing USA

克隆对象属性: liujinyu CHAIN

 

基本上的解释到这里,还需要完善。希望有看到此博客的博主们,进行建议,我们互相交流学习。谢谢

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值