本人之前一直在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
基本上的解释到这里,还需要完善。希望有看到此博客的博主们,进行建议,我们互相交流学习。谢谢