2011年(23)
分类: Python/Ruby
2011-12-15 14:35:45
原文链接:http://www.cnblogs.com/wait123/archive/2011/10/10/2206580.html
这两天又回头看了看python中的赋值、浅拷贝和深拷贝,以前看的时候总觉得他们之间有关系,但又理不清楚,今天总算有了点头绪,所以跟大家分享一下我的理解。
先说说赋值,其实python中的赋值其实是赋值了一个引用,例如:
foo1=1.0
foo2=foo1
用操作符is判断时,你可以发现结果是true,是因为python是先创建了一个对象1.0,然后这个对象的引用又被赋值给了foo1和foo2,但是如果是这样:
foo1=1.0
foo2=1.0
这时你会发现,这其实是创建了两个不同的对象,用内建函数id()可以发现,二者的身份不同;
其实python还有一个特例,例如:
a=1
b=1
你会发现id(a)=id(b),原因是python认为这些小整型是会经常用到的,所以python会缓存一部分小整型。
其次再说说浅拷贝和深拷贝。
序列类型的可以通过三种方式实现浅拷贝,浅拷贝也是默认的拷贝类型:(1)完全切片操作;(2)利用工厂函数,比如list()等;(3)使用 copy模块中的copy()函数。然而对于非容器类型没有拷贝这这一说。在《python核心编程》一书中说道,“对一个对象进行浅拷贝其实是新创建了 一个类型跟原对象一样,其内容是原来对象元素的引用,换句话说,这个拷贝的对象本身是新的,但是它的内容不是”读完这句话我的理解是浅拷贝其实是赋值,但 后来发现不然,因为赋值的结果是他们的身份相同,但是浅拷贝的身份却不同,下面我结合书上的例子以及我自己的想法来说明这句话是什么意思。
fanwei@ubuntu:~$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> person=['name',['saveing',100]]
>>> wife=person[:]
>>> hubb=list(person)
>>> id(person)
3078619916L
>>> id(wife)
3078621548L
>>> id(hubb)
3078621996L