python 深复制与浅复制------copy模块

模块解读:

浅复制: x = copy.copy(y)
深复制: x = copy.deepcopy(y)
(注:模块特有的异常,copy.Error)

深copy与浅copy的差别主要体现在当有混合对象时,即在一个对象中包含其他子对象,比如在一个字典中的一个value是一个列表,这时:
浅copy,没有拷贝子对象,所以原始数据改变,子对象会跟着改变。
深copy,包含拷贝对象中对子对象的拷贝,也就是说原始数据改变,子对象不会随之改变。

举个例子:
info = {
‘name‘:‘webber‘,
‘job‘:‘IT‘,
‘age‘:24,
‘girlfriend‘:[‘a‘,‘b‘,‘c‘]
}

new_info = copy.copy(info)        #浅copy
new_info[‘sex‘] = ‘male‘

print ‘info: ‘,info
print ‘new_info‘,new_info

输出:
info: {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}
new_info {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘sex‘: ‘male‘, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}

-------------------------------------------------------------------------------------------

new_info = copy.copy(info)        #浅copy
new_info[‘girlfriend‘].append(‘dddd‘)

输出:
info: {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘, ‘dddd‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}
new_info {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘, ‘dddd‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}

-------------------------------------------------------------------------------------------

new_info = copy.deepcopy(info)      #深copy
new_info[‘sex‘] = ‘male‘

输出:
info: {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}
new_info {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘sex‘: ‘male‘, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}

-------------------------------------------------------------------------------------------

new_info = copy.deepcopy(info)      #深copy
new_info[‘girlfriend‘].append(‘dddd‘)

输出:
info: {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}
new_info {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘, ‘dddd‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘}

--------------------------------------------------------------------------------------------

这里发现,当往字典中添加sex信息时,无论深copy还是浅copy都互不影响,但是在往字典的子对象列表中添加信息时有了区别,浅copy把子对象都做出了修改,而深copy却没有,更新new_info信息,info字典中的信息没有发生改变。

这里还要把浅copy与直接赋值做一下区分:
直接赋值,就是传递对象的引用,即原始数据改变,新的赋值对象数据也会随之改变,

沿用上面的例子:
new_info = info
new_info[‘sex‘] = ‘male‘

输出:
info: {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘, ‘sex‘: ‘male‘}
new_info {‘girlfriend‘: [‘a‘, ‘b‘, ‘c‘], ‘age‘: 24, ‘job‘: ‘IT‘, ‘name‘: ‘webber‘, ‘sex‘: ‘male‘}  #完全相同

无论修改谁,另一个都会改变,因为他们指向同一个内存空间。

另一个详细例子:http://www.cnblogs.com/xueli/p/4952063.html

=============================================================

此外,模块用法中提到两个注意点,在深copy中可能会遇到的问题,而浅copy中不存在:

1、深copy递归的把所有子对象都复制了,这里存在一个递归循环,可能会引起性能资源的不足,使用时应该当心。

2、由于深copy把一个对象的“所有”都给copy了,那么当深copy一个重要的对象时,假如里面含有管理权限的数据结构,这样可能把这些信息共享给了不具有管理权限的对象。

时间: 2024-12-20 00:34:54

python 深复制与浅复制------copy模块的相关文章

python 字典深复制和浅复制

#!/usr/bin/python# -*- coding: UTF-8 -*- import copydict1 = {'user': 'vickey', 'num': [1, 2, 3],'age':{'a':'1','b':'2'}}dict2 = dict1 # 对原始数据的任何操作都会影响该复制# 先进行数据的浅复制和深复制操作dict3 = dict1.copy() # 浅复制: 一级为引用对象,二级为拷贝:原始数据的二级目录改变了,浅复制的数据的二级目录也会改变,但一级目录不变di

OC 中 的copy 功能 深复制 和 浅复制 的 区别

系统的类要是实现copy拷贝的功能,必须先签订拷贝NSCopying的协议,然后实现对应的方法 在.h文件中得@interface Boy : NSObject 的后面需要签订拷贝NSCopying的协议 例子: 在.h文件中 @interface Boy : NSObject<NSCopying> 1. Boy类使用copy的方法 例子: Boy *boy =[Boy boyWithName:@"zhangyangyang" hobby:@"wan"]

关于copy深复制与浅复制的理解

浅复制:浅复制(浅拷贝,指针拷贝,shallow copy),源对象和副本对象是同一个对象, 源对象(副本对象)引用计数器 + 1, 相当于做一次retain操作. 本质是:没有产生新的对象 深复制:(深拷贝,内容拷贝,deep copy),源对象和副本对象是不同的两个对象,源对象引用计数器不变, 副本对象计数器            为1(因为是新产生的) 本质是:产生了新的对象 *只有源对象和副本对象都不可变时,才是浅复制,其它都是深复制

iOS 集合的深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

深复制与浅复制

概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCopyArray = [someArray cop

iOS深复制和浅复制

1.copy关键字 1> 浅拷贝与深拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间. 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉. 2> copy和mutableCopy copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一.始终返回一个不可变对象. mutableCopy:始终是深复制,引用计数不改变.始终返回一个可变对象. 3

(知其所以然 主题2)从底层分析OC中ARC和非ARC下深复制和浅复制

今天,在坊间听到有人在争论OC中关于NSString的深浅复制,听了下,感觉很有必要来一个分析总结,让我们从底层去了解OC中深浅复制的运作机制. 所谓copy就是在原有对象的基础上产生一个副本对象,遵循最关键的两点原则: 1. 改变原对象的属性和行为不会对副本对象产生任何影响 2. 改变副本对象的属性和行为不会对原对象产生任何影响 在理解了这一层之后,我们一起来研究下deep copy 和 shallow copy,因为苹果是一个非常注重性能的公司,所以拷贝在底层实现没那么简单: 以NSStri

js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)

在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制,今天鹏哥就带来js中的复制方法. JS中对象分为基本类型和复合(引用)类型,基本类型存放在栈内存,复合(引用)类型存放在堆内存. 堆内存用于存放由new创建的对象,栈内存存放一些基本类型的变量和对象的引用变量. 至于堆内存和栈内存的区别介绍,你们可以百度看看. 下面开始讲解复制: 这种只是简单的变量,内存小,我们直接复制不会发生引用. var a=123; var b=a; a=123456; alert(a); //1234

.NET中深复制与浅复制

概述: 在.NET里面,提供对象复制的功能,前提是实现ICloneable接口.ICloneable接口中有一个Clone方法, 可以在类中覆写实现自定义的拷贝方法.对象复制的实现方法有两种:深复制和浅复制. 深复制和浅复制: 浅复制,浅复制是指源对象与复制出来的对象共用一份实体,对其中任何一个对象的改动都会影响另外一个对象.相当于复制了指针. 深复制:指源对象与复制对象互相独立,为新对象重新分配了一段内存空间,并复制源对象的内容.其中任何一个对象的改动都不会对另外一个对象造成影响. 深浅复制与

C++学习基础七——深复制与浅复制

一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深复制时,A中的指针str与B中的指针str指向不同的地址,只是地址所指向的数据相同. 当浅复制时,A中的指针str与B中的指针str指向相同的地址. 1.浅复制:如果我们自己不实现复制构造函数,则C++会自动合成一个复制构造函数,又称为浅复制构造函数. 2.深复制:如果使用指针或者系统资源(如数据库