python中的copy模块(浅复制和深复制)
来源:互联网 发布:vb牛顿迭代法求平方根 编辑:程序博客网 时间:2024/05/17 22:35
在总结copy模块中的浅复制(copy)和深复制(deepcopy)前,先对“引用”做下说明:
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子:
问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制。
a=[1,2]
b=a
这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
a=[1,2]
b=a[:]
这样修改a对b没有影响。修改b对a没有影响。
但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成[2]的一个新的列表复制。为了证明这一点,测试步骤如下:
>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>>a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]
可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
>>> import copy
>>>a=[1,[2]]
>>>b=copy.deepcopy(a)
>>> b
[1, [2]]
>>>a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]
########
copy(x)潜复制
########
创建新的复合对象并通过引用复制x的成员来创建x的潜复制,它复制了对象,但对于对象中的元素,依然使用引用。对于内置类型,此函数并不经常使用。而是使用诸如list(x), dict(x), set(x)等调用方式来创建x的浅复制,要知道像这样直接使用类型名显然比使用copy()快很多。但是它们达到的效果是一样的。
判断对象之间是否是拷贝,可以用下面方法:
a is b ->True a与b引用的是同一个对象,不是拷贝;
-> False a与b是彼此拷贝对象;
引出例子来说明:
(1)
>>> a = [1,2,3]
>>> b = copy.copy(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>> a is b
False
(2)
>>> a = [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> b.append(6)
>>> a, b
([1, 2, 3, 4, 6], [1, 2, 3, 4, 6])
(3)
>>> a = [1,2,3]
>>> b = list(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>> (相当于b=copy(a))
(4)
>>> a = [[1], ['a'], ['A']]
>>> b = copy.copy(a)
>>> print a, b
[[1], ['a'], ['A']] [[1], ['a'], ['A']]
>>> b[1].append('b')
>>> b
[[1], ['a', 'b'], ['A']]
>>> a
[[1], ['a', 'b'], ['A']]
>>> b.append([100,101])
>>> b
[[1], ['a', 'b'], ['A'], [100, 101]]
>>> a
[[1], ['a', 'b'], ['A']]
############
deepcopy()函数
###############
完全的拷贝一个对象和一个对象的所有元素的值, 通过创建新的复合对象并重复复制x的所有成员来创建x的深复制。
eg:
>>> a = [[1], ['a'], ['A']]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[[1], ['a'], ['A']]
>>> c = copy.copy(a)
>>> c
[[1], ['a'], ['A']]
>>> a[1].append('b')
>>> a
[[1], ['a', 'b'], ['A']]
>>> b
[[1], ['a'], ['A']]
>>> c
[[1], ['a', 'b'], ['A']]
- python中的copy模块(浅复制和深复制)
- python中的copy模块(浅复制和深复制)
- python中的copy模块(浅复制和深复制)
- copy模块的,浅复制和深复制
- Python中的copy()方法为“浅复制”
- python 浅复制、深复制(copy/deepcopy)
- Python 复制中的深复制与浅复制
- python的深复制和浅复制
- python 深复制和浅复制
- Python List 深复制和浅复制
- java中的深复制和浅复制
- javascript中的浅复制和深复制
- C#中的深复制和浅复制
- java中的深复制和浅复制
- java中的深复制和浅复制
- js中的深复制和浅复制
- java中的深复制和浅复制
- Java中的深复制和浅复制
- java学习笔记-----QQ项目-------对象流的使用
- Mahout的BreimanExample例子分析
- 数据结构实验之链表七:单链表中重复元素的删除
- 黑马程序员——对象与函数
- 完成请求后回到上一级页面
- python中的copy模块(浅复制和深复制)
- 黑马程序员——java复习总结——面向对象
- Linux常用命令英文全称以及中文解释
- java 基础
- *** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit
- 回文字符串—— Manacher算法
- Linux服务器网络开发模型
- 安装Ubuntu server 时报错 "The 'grub-pc' package failed to install into /target/ 的解决方法
- 使用MetaSploit在WinXP对Win2000进行攻击