首页 / 知识
python的深浅拷贝
2023-11-12 13:41:00
1.python中,对象赋值实际是对对象的引用,比如:
alist=[1,2,[1,2,3]]
b=alist
其中,b就是直接引用**ist指向的对象,也就是内存中heap中的一个值,以后这个值发生了什么变化,b和alist就跟着变化
2.浅拷贝--copy,直接看例子:可以看到,浅拷贝只拷贝父对象,不会拷贝对象内部的子对象。我不是很理解这句话,其实就是浅拷贝如果
里面是具体的值,则拷贝的对象不会变化,如果是拷贝的是堆对象,则跟着堆对象的变化而变化?
l=[1,2,[1,2,3]]
>>>m=copy.copy(l)
>>>m
[1,2,[1,2,3]]
>>>l[2].append(4)
>>>l
[1,2,[1,2,3,4]]
>>>m
[1,2,[1,2,3,4]]
>>>l[0]=100
>>>l
[100,2,[1,2,3,4]]
>>>m
[1,2,[1,2,3,4]]
现在依次把m,l中的值地址打印出来:
[id(x)forxinm]
[35289464L,35289440L,55546952L]
>>>[id(x)forxinl]
[35291072L,35289440L,55546952L]
可以看到末端的列表元素指向的是同一个地址,所以这个地址里的东西发生变化了,就都会变化呀
再举一例:
>>>l=[1,2,{'age':90}]
>>>l
[1,2,{'age':90}]
>>>m=copy.copy(l)
>>>m
[1,2,{'age':90}]
>>>[id(x)forxinl]
[35289464L,35289440L,55566680L]
>>>[id(x)forxinm]
[35289464L,35289440L,55566680L]
>>>l[2]=[1,2]
>>>l
[1,2,[1,2]]
>>>m
[1,2,{'age':90}]
>>>[id(x)forxinl]
[35289464L,35289440L,55548552L]
3.深拷贝:直接就是拷贝了对象本身,即堆内存中的那一坨,那你原来那一坨的改变就不能影响深拷贝的元素的变化了
>>>mimi=['mimi',['age',30]]
>>>kiki=copy.deepcopy(mimi)
>>>bibi=copy.deepcopy(mimi)
>>>printid(mimi),id(kiki),id(bibi)
555754965554733655546248
>>>kiki
['mimi',['age',30]]
>>>bibi
['mimi',['age',30]]
>>>kiki[0]='kiki'
>>>bibi[0]='bibi'
>>>printmimi,kiki,bibi
['mimi',['age',30]]['kiki',['age',30]]['bibi',['age',30]]
>>>kiki[1][1]=31
>>>kiki
['kiki',['age',31]]
>>>bibi[1][1]=32
>>>printmimi,kiki,bibi
['mimi',['age',30]]['kiki',['age',31]]['bibi',['age',32]]
>>>[id(x)forxinmimi]
[53922472L,55631304L]
>>>[id(x)forxinmimi]
[53922472L,55631304L]
>>>[id(x)forxinkiki]
[56337952L,55546760L]
>>>[id(x)forxinbibi]
[53923752L,55600264L]
从例子看出,深拷贝就不会列表中的列表发生一起改变的事情,
总结一下:
1.利用切片和工厂方法,copy方法进行的拷贝都是浅拷贝,就是拷贝的是原有对象的地址,在这个地址上发生的改变之后都被记下来,
切片复制:
p=[1,2,3]
t=p[:]
工厂方法:
t=list(p)
copy方法:
t=copy.copy(p)
2.利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。就是把所有的值复制了一遍,
原有地址的变化和拷贝发生后的对象毫无关联
注意的是:对于数字,字符串,其他原子类型的对象来说,没有拷贝的说法,原子类型对象:个人感觉就是存放在栈中的对象,顾名思义
就是不可再分割,或是组成其它数据类型的元元素。python来说就是数字,字符串
以上内容为大家介绍了python的深浅拷贝,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
Python中什么是反射?使用方法有哪
Python中什么是反射?使用方法有哪些?,信息,培训,状态,术语,检测,反射,属性,对象,字符串,方法,反射这个术语在很多语言中都存在,并且存在大量的大学生报名Python培训课程的好处是
大学生报名Python培训课程的好处是什么?,培训,企业,社会,项目,行业,工作,时间,技术,都会,素养,一、报名学习前沿技术在IT行业,技术在不断变化和线上Python培训和线下有什么不同?
线上Python培训和线下有什么不同?,培训,基础,实战,电脑,项目,教育,时间,地方,初级,技术,学习互联网技术的人越来越多,很多机构都采取线上和线下Python中有哪些方法可以解压文件?
Python中有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大报名Python培训选择哪种方式比较好
报名Python培训选择哪种方式比较好?,培训,工作,基础,时间,情况,在线,最划算,环境,系统,方式,Python不仅是一种高级的编程语言,而且还是一种应用Python列表类型list合并有哪些方法
Python列表类型list合并有哪些方法?,培训,方法,列表,可能会,数组,切片,下文,字符串,数据类型,请看,在Python编程语言中,有各种数据类型,比如字符在Python培训中有哪些必学的运算符
在Python培训中有哪些必学的运算符?,项目,培训,数字,变量,赋值,符号,两个,表示,数学,示例,不论是Python还是其他后端编程语言,都少不了运算符的零基础学习Python的四种方法
零基础学习Python的四种方法,基础,代码,基础知识,培训,发展,时间,知识,书籍,初学者,练习,近年来,随着移动互联网的发展,对Python人才的需求越来pythonPandas Series对象有哪些属
pythonPandas Series对象有哪些属性?,工具,数据,数字,分析,培训,属性,数据类型,数组,对象,索引,想必大家都知道pandas,它是基于Numpy的一种工具python是面向对象还是面向过程的
python是面向对象还是面向过程的,数据,代码,基础,形态,培训,术语,设计,对象,过程,语言,Python虽然是解释型语言,但从设计之初就已经是一门面向深圳python培训课程哪家靠谱?
深圳python培训课程哪家靠谱?,深圳,人工智能,培训,检测,分析,实战,行业,转型,时间,体系,Python语言简单、易学、易读、易维护,学习成本和时间相学习Python有必要报培训班吗?
学习Python有必要报培训班吗?,项目,培训,企业,实战,行业,技术,做好,汽车,行情,体系,伴随着人工智能的广泛应用,Python被广泛应用于web开发、运