[Python]copy模块学习 -- 深拷贝和浅拷贝
2013-04-17 20:01
232 查看
Python拷贝对象常用的模块是copy模块,这个模块有两个方法,copy,deepcopy也就是常说的浅拷贝和深拷贝
那么2种拷贝有什么不同呢? 今天就来研究下,这里研究对象是否相同用的是id()方法,也可以用is方法来判断
引用python核心编程的一段话来总结下
第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和 xrange 对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.
第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.
那这种不同的拷贝会给我们带来怎么样的奇怪的问题呢?来看看python核心编程中一个很好的例子
加入说我们用 person = ['name',['saving',100.00]]来表示一个人和他的存款,假设现在有2对夫,我们来看看不同拷贝造成的影响
也就是说其实夫妻是共同的一个账户,一个人的变化也会影响到另一个人的金额的变化
深拷贝之后丈夫和妻子的账户都是独立的,谁也不会影响谁
看到差别了吗,如果我们想让一个容器类型的一个容器类型的子元素不被所有引用对象共享,就要使用深拷贝了。
那么2种拷贝有什么不同呢? 今天就来研究下,这里研究对象是否相同用的是id()方法,也可以用is方法来判断
浅拷贝有几种方法:
第一种就是使用copy.copy()方法
>>> import copy >>> a = [[1,3]] >>> b = copy.copy(a) >>> print id(a),id(b) #a b引用的id不同 48701112 48720992 >>> id(a[0]) #但是a,b内元素的id是相同的 48697992 >>> id(b[0]) 48697992
第二种是切片浅拷贝
>>> print id(a[0]),id(c[0]) 48697992 48697992
第三种就是list,dict,set,tuple的构造函数来做copy
>>> print id(a[0]),id(d[0]) 48697992 48697992 >>> a[0] == b[0] True >>> a[0] is d[0] True
深拷贝只有用copy的deepcopy方法了
>>> e = copy.deepcopy(a) >>> a[0] == e[0] True >>> a[0] is e[0] False >>> print id(a[0]),id(e[0]) #这次我们发现深拷贝后的e的第一个元素id和原来的a的子元素的id不同了 48697992 48692160
引用python核心编程的一段话来总结下
第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和 xrange 对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.
第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.
那这种不同的拷贝会给我们带来怎么样的奇怪的问题呢?来看看python核心编程中一个很好的例子
加入说我们用 person = ['name',['saving',100.00]]来表示一个人和他的存款,假设现在有2对夫,我们来看看不同拷贝造成的影响
案例
家庭一 :浅拷贝
>>> person = ['name',['saving',100.00]] >>> husband1 = person >>> wife1 = person >>> print husband1,wife1 ['name', ['saving', 100.0]] ['name', ['saving', 100.0]] #现在我们看到2个人的账户中都是100块 >>> husband1[1][1] = 50.00 #现在丈夫取走50 >>> print husband1,wife1 ['name', ['saving', 50.0]] ['name', ['saving', 50.0]] # 怎么妻子也是50了呢
也就是说其实夫妻是共同的一个账户,一个人的变化也会影响到另一个人的金额的变化
家庭二:深拷贝
>>> person = ['name',['saving',100.00]] >>> husband2 = person >>> wife2 = copy.deepcopy(person) >>> husband2[0] = 'Jack' >>> wife2[0] = 'Rose' >>> print husband2,wife2 ['Jack', ['saving', 100.0]] ['Rose', ['saving', 100.0]] #2个人都是100块 >>> husband2[1][1] = 50.00 #丈夫取出50 >>> print husband2,wife2 ['Jack', ['saving', 50.0]] ['Rose', ['saving', 100.0]] #妻子还是100
深拷贝之后丈夫和妻子的账户都是独立的,谁也不会影响谁
看到差别了吗,如果我们想让一个容器类型的一个容器类型的子元素不被所有引用对象共享,就要使用深拷贝了。
相关文章推荐
- Python中使用copy模块实现列表(list)拷贝
- python学习笔记:深拷贝,浅拷贝
- Python学习 之 对内存的使用(浅拷贝和深拷贝)
- Python学习笔记(5):赋值、浅拷贝、深拷贝
- 我的Python学习笔记(二):浅拷贝和深拷贝
- Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝
- Python学习17:使用Python拷贝文本文件
- Python学习(21)--深拷贝与浅拷贝
- Python学习笔记——深拷贝与浅拷贝
- Python编程学习——拷贝
- python的学习:导入模块路径、重新加载路径、 is ==、深拷贝和浅拷贝
- Python中使用copy模块实现列表(list)拷贝
- python的学习:导入模块路径、重新加载路径、 is ==、深拷贝和浅拷贝
- python学习笔记:深浅拷贝的使用和原理
- Python学习笔记之拷贝
- 学习 python 连接字符串,替换,截取,引用,拷贝,is,def返回值,异常
- python学习笔记七:浅拷贝深拷贝
- 流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数
- Python语言学习讲解一:【赋值、浅拷贝与深拷贝】
- Python 学习日记第六篇 -- 深浅拷贝