Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

作者&投稿:撒枝 (若有异议请与网页底部的电邮联系)
Python中的赋值,浅拷贝和深拷贝的区别~

浅拷贝会出现什么问题呢?
假如有一个成员变量的指针,char *m_data;
其一,浅拷贝只是拷贝了指针,使得两个指针指向同一个地址,这样在对象块结束,调用函数析构的时,会造成同一份资源析构2次,即delete同一块内存2次,造成程序崩溃。
其二,浅拷贝使得obj.m_data和obj1.m_data指向同一块内存,任何一方的变动都会影响到另一方。
其三,在释放内存的时候,会造成obj1.m_data原有的内存没有被释放(这句话,刚开始我不太理解,如果没有走自定义的拷贝构造函数,申请内存空间,A obj1(obj);也不走默认构造函数,走的是默认的拷贝构造函数,何来分配空间直说,更不会造成obj1.m_data原有的内存没有被释放,这里刚开始我一直有疑问),造成内存泄露。
事实是这样的,当delete obj.m_data, obj.m_data内存被释放后,由于之前obj.m_data和obj1.m_data指向的是同一个内存空间,obj1.m_data所指的空间不能在被利用了,delete obj1.m_data也不会成功,一致已经无法操作该空间,所以导致内存泄露。

深拷贝采用了在堆内存中申请新的空间来存储数据,这样每个可以避免指针悬挂。

在Python中存在深拷贝与浅拷贝的区别,相信有些Python初学者可能就有些疑惑,是指什么意思呢?
1. 赋值其实只是传递对象引用,引用对象id是一样的。
2. 浅拷贝是指拷贝的只是原始对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。
3. 深拷贝是指完全拷贝原始对象,而且产生的对象是新的,并且不受其他引用对象的操作影响。

赋值(=):就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}

首先赋值(=)
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的yinyong{1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的fuzhi它所包含的对想{copy模块的deep.deepcopy()函数}三人行
慕课
有详细教程


如何用python在rhino里面绘制控制点曲线?用python在rhino里面绘制控制点...
0,10,0],[0,10,10],[10,10,10],[10,0,10],[0,0,10],[0,0,0]]文章开头的那个管状曲面,就是这个曲线对应的圆管。关于“用python在rhino里面绘制控制点曲线的教程”就到这里了,看完这个教程你知道怎么操作了吧,是不是觉得rhino的使用还挺简单的呢!点击这个链接可以了解更多rhino教程:

如何用python实现字符串的删除操作?
一、问题描述:从键盘输入一个字符串给str和一个字符给c,删除str中的所有字符c并输出删除后的字符串str。1、输入:第一行是一个字符串; 第二行是一个字符。2、输出:删除指定字符后的字符串。二、设计思路:1、 同插入问题,定义两个字符数组a,b。以及标志删除位置的int型pos。2、用gets函数...

python如何判断self.属性是否存在
有关这个问题 有三种解决办法:方法一:这就要使用一个函数:hasattr(object, name)下面看下函数hasattr()的用法:如果自己定义的话:可以通过返回值来判断!方法二:用dir来判断:代码含义:如果objlist对象里面存在att属性,则打印出改属性!方法三:代码含义:通过异常捕捉来实现逻辑!

Python如何把数值放到一个数组里面
Python把数值放到一个数组里面的步骤如下:1.第一步,定义一个列表a,赋值为1-9这九个数字元素,注意表示形式。2.第二步,利用类似JavaScript中数组的取值方式,将列表a中的第二个、第四个、第六个和第八个取出来拼成一个新列表。3.第三步,如果列表中的元素有很多,需要换成其他的方法拼接,但是...

请问python里面如何定义数据类型,即声明变量类型?
这个不是声明类型的问题,因为a和b在你调用的时候已经int所以除出来的数也是只取整数,及时你声明了C的类型结果也只是0.0 建议:def test(a,b):a1=float(a)b1=float(b)c=a1\/b1 return c

用python从键盘输入一个字符串,统计其中大写小写字母以及数字的个数...
1、可以这样编写程序:定义一个含有所有小写字母的列表变量w及一个待测字符串变量s。对s字符串中的每一个字符进行循环迭代检测其是否位于变量w中,若为真,则对计数变量c进行加一操作。输出c变量,即为所求。2、初学者的话确实可以通过asciitable来判断字母和数字的区别。Python里面有两个内置函数ord和...

python中多进程+协程的使用以及为什么要用它
因为协程是用户自己来编写调度逻辑的,对CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。how:python里面怎么使用协程?答案是使用gevent,使用方法:看这里 使用协程,可以不受线程开销的限制,我尝试过一次把20W条url放在...

python中如何把string 转换成int
分析如下:float('30.7894')=30.7894;python中的字符数字之间的转换函数:

python如何达不到条件就循坏?
import random prompt_1=int(input('xxxxxx'))if prompt_1==1:number_1=random.randint(0,50)guess_1=-1 while guess_1!=number_1:guess_1=int(input('yyyyyy'))if guess_1<number_1:print('你猜的小了')if guess_1>number_1:print('你猜的大了')print('你赢了')...

python中如何在一个类中调用另一个类的method中的变量?能实现吗?能 ...
Student是一个类型,你都没创建一个实例,__init__是实例的初始化函数,使用"__"修饰,是私有函数,不能在外部调用,然后那个里面参数的self是Students的self肯定是访问不到id和name的属性的。总的来说,代码存在很多的问题。想要获得的结果是两个列表中元素所有组合的可能性,可以这样实现:Name = [...

普洱市15746107445: python 怎么获得对象的拷贝 -
郁启觉觉: 使用标准库自带的copy模块,该模块提供了深拷贝和浅拷贝方法 copy.copy(x) 返回x的浅拷贝对象 copy.deepcopy(x) 返回x的深拷贝对象.

普洱市15746107445: python里面的列表复制 -
郁启觉觉: strLst 里最后一个元素本身是一个可修改的list,copyLst最后一个元素引用的也是这个对象,修改它当然也会导致原strLst 的最后一个对象内容发生变化. 而strLst 前几个元素是字符串 (不可改对象),你没有办法修改他们,copyLst[1] = 'zzz' 这样...

普洱市15746107445: python中对象怎么传递啊? -
郁启觉觉: 额..可以有几种方法,一个是单独为这个对象写个模块,然后在import 111.py,在222.py中调用这个模块.不过现在一般不这么干啦,可以用222.py直接继承111.py,将driver这个对象放入__init__中,子类222.py就能用了...

普洱市15746107445: python2.7怎么复制代码 -
郁启觉觉: python2.7中粘贴复制跟记事本一样的,如果是在IDE中,也就是带着>>>的交互界面的话,复制粘贴后需要注意重新排版,要不肯定报错的.

普洱市15746107445: python中,如何复制一个dataframe,更改任意dataframe,不影响另一个dataframe的值? -
郁启觉觉: 你好,那个dateframe里面的list只能是引用,你想不改变的话,只能是对每个list都做a =a[:]才可以使得修改不影响原来的dataframe

普洱市15746107445: python深拷贝和浅拷贝的区别 -
郁启觉觉: 深拷贝指将对象本身复制给另一个对象,对对象副本进行修改不会影响原对象,常使用deepcopy()函数进行深拷贝;浅拷贝指将对象的引用赋值给另一个对象,因此如果更改副本,原对象也会受到影响,使用copy()函数进行浅拷贝.

普洱市15746107445: 求大神名明示python中copy 与 '=' 的区别 -
郁启觉觉: 当你a=1000的时候a指向一个新的类,内容为1000,而b仍然指向原来指向的内容,因为你没有叫它指向其他内容.你使用=符号,使得a和b指向同一个内容,而copy则是将b的内容复制后让c指向这个拷贝的内容上了.看下面图种运行的结果.b=a,使用a改变"age",b和a中的都改变了.而c采用copy,不受影响.等会儿画个图补充上来就更容易理解了.

普洱市15746107445: 请大神解答:python怎么复制图片到目标文件夹?小弟感激不尽! -
郁启觉觉: 你好: 如下: # -*- coding: cp936 -*- import os,shutilfrompath=r"C:\Users\YU\Desktop" topath=r"C:\Users\YU\Desktop\newName.png" for r,ds,fs in os.walk(frompath):for f in fs:if f=="无标题.png":oldPath=os.path.join(r,f)shutil.copy(oldPath,topath) print "ok"

普洱市15746107445: Python的复制,深拷贝和浅拷贝的区别 -
郁启觉觉: 简单点说1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下:>>>import copy>>>a = [1, 2, 3, 4, ['a', 'b', 'c']]>>> b = a>>> c = copy.copy(a)>>> d = copy....

普洱市15746107445: 请教大家:用PYTHON如何把一个文件里的指定内容存放到另一个文件里. -
郁启觉觉: 你可以1. 打开那个文件2. 找到要存放的内容,把它读出来并放在一个变量里3. 关闭那个文件4. 打开另一个文件5. 把那个变量里的东西写进去 6. 关闭另一个文件game ove

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网