码迷,mamicode.com
首页 > 编程语言 > 详细

Python中的深浅拷贝详解

时间:2014-12-11 00:17:34      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:python

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下:

变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝 


变量-对象-引用

在Python中一切都是对象,比如说: 3, 3.14, ‘Hello‘, [1,2,3,4],{‘a‘:1}......

bubuko.com,布布扣

甚至连type其本身都是对象,type对象

Python中变量与C/C++/Java中不同,它是指对象的引用

单独赋值: 比如说: 

>>> a = 3

在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针

bubuko.com,布布扣

专业表述如下:

变量是一个系统表的元素,拥有指向对象的连接的空间

对象是被分配的一块内存,存储其所代表的值

引用是自动形成的从变量到对象的指针

特别注意: 类型属于对象,不是变量

比如像刚才的a=3, 整数对象3包含了两重信息

1. 值为3

2. 一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]


共享引用: 比如说

>>> a = 3

>>> b = a

在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.

bubuko.com,布布扣

bubuko.com,布布扣

从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存

bubuko.com,布布扣

如果删掉a后, 不会影响b

可变对象-不可变对象

在Python中是指不可变对象:一旦创建就不可修改的对象,包括字符串,元祖,数字

在Python中是指可以修改的对象,包括:列表、字典


上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。

>>> L1 = [2,3,4]      #L1变量指向的是一个可变对象:列表
>>> L2 = L1           #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]
>>> L1[0] = 200       #因为列表可变,改变L1中第一个元素的值
>>> L1; L2            #改变后,L1,L2同时改变,因为对象本身值变了
[200, 3, 4]
[200, 3, 4]
如果在实际上,不想出现改变L2的值,有两种方法:切片技术 拷贝 
>>> L1 = [2,3,4] 
>>> L2 = L1
>>> id(L1);id(L2)     #如果只是共享引用一个可变对象的话
45811784L
45811784L
>>> L2 = L1[:]        #切片后,对象就不一样了
>>> id(L1);id(L2)     #切片后,对象就不一样了
45811784L
45806920L
>>> L1[0] = 200
>>> L1;L2             #L1发生改变,L2没有变化
[200, 3, 4]
[2,   3, 4]
拷贝

1. 切片技术应用于所有的序列,包括:列表、字符串、元祖 

   >>>但该技术不会应用Python可变的核心类型字典.对字典只能使用D.copy()方法或D.deepcopy()方法.

bubuko.com,布布扣

2. 深浅拷贝,计可用于序列,也可用于字典

   >>> import copy

   >>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

   >>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

  • 如果字典只有顶级对象:

bubuko.com,布布扣

  • 如果字典中嵌套对象:

bubuko.com,布布扣

结论

  • 深浅拷贝都是对源对象的复制,占用不同的内存空间
  • 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
  • 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝


Python中的深浅拷贝详解

标签:python

原文地址:http://blog.csdn.net/jerry_1126/article/details/41852591

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!