Python对象之深拷贝、浅拷贝
2015-06-21 22:41
537 查看
“对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用。换句话说,这个拷贝的对象本身是新的,但是它的内容不是”
上面这段话摘自《Python核心编程》,我个人觉得说得很好。如果你也能够看懂的话,那么恭喜你。
看一段代码:
id(person[0])==id(hubby[0])==id(wifey[0])
id(person[1])==id(hubby[1])==id(wifey[1])
大致画了一下内存图:
从图中可以很容易看出id(person)、id(hubby)、id(wifey)是不同的,而person[0]、hubby[0]、wifey[0]指向的是同一个对象"name",person[1]、hubby[1]、wifey[1]指向的是同一个列表['savings',
100.00],这就是所谓的浅拷贝。
看到这,想必大家都知道什么是深拷贝了,继续看代码:
结合代码看图:
从图中可以很容易得看出,wifey和hubby中的内容(即wifey[0]、wifey[1]和hubby[0]、hubby[1])是完全不同的;
可能有的人问:为什么hubby[1][0]与wifey[1][0]、hubby[1][1]与wifey[1][1]指向的仍然是同一个对象?
其实这个原因很简单,因为在定义peroson这个列表时,就在内存中创建了'savings'和100.00这两个对象,而后面的hubby和wifey也要用到这两个对象,所以就直接拿过来用,没有必要再浪费内存空间创建一个新的和原来一模一样的对象。
这就是深拷贝,可以看到,我们在程序中使用了一个copy模块的函数deepcopy(),用它来完成深拷贝;其次,copy模块还有一个函数copy(),用它可以完成浅拷贝。
注意:1、非容器类型(比如数字、字符串和其他“原子”类型的对象等)没有深拷贝一说;
2、如果元组变量只包含原子类型对象(不可变对象),对它的深拷贝将不会进行,得到的就是浅拷贝。
上面这段话摘自《Python核心编程》,我个人觉得说得很好。如果你也能够看懂的话,那么恭喜你。
看一段代码:
>>>person = ['name', ['savings', 100.00]] >>>hubby = person[:] >>>wifey = list(person) >>>[id(x) for x in person, hubby, wifey] [5332344, 5338216, 5341912]从输出结果可以看出,person,hubby和wifey是不同的对象,
>>>[id(x) for x in person] [4734944, 5338256] >>>[id(x) for x in hubby] [4734944, 5338256] >>>[id(x) for x in wifey] [4734944, 5338256]分别将输出person[0],person[1], hubby[0], hubby[1], wifey[0], wifey[1]的id进行比对,结果发现:
id(person[0])==id(hubby[0])==id(wifey[0])
id(person[1])==id(hubby[1])==id(wifey[1])
大致画了一下内存图:
从图中可以很容易看出id(person)、id(hubby)、id(wifey)是不同的,而person[0]、hubby[0]、wifey[0]指向的是同一个对象"name",person[1]、hubby[1]、wifey[1]指向的是同一个列表['savings',
100.00],这就是所谓的浅拷贝。
看到这,想必大家都知道什么是深拷贝了,继续看代码:
>>>import copy >>>person = ['name', ['savings', 100.00]] >>>hubby = person >>>hubby[0] = 'Joe' >>> >>>wifey = copy.deepcopy(person) >>>wifey[0] = 'Jane'
结合代码看图:
从图中可以很容易得看出,wifey和hubby中的内容(即wifey[0]、wifey[1]和hubby[0]、hubby[1])是完全不同的;
可能有的人问:为什么hubby[1][0]与wifey[1][0]、hubby[1][1]与wifey[1][1]指向的仍然是同一个对象?
其实这个原因很简单,因为在定义peroson这个列表时,就在内存中创建了'savings'和100.00这两个对象,而后面的hubby和wifey也要用到这两个对象,所以就直接拿过来用,没有必要再浪费内存空间创建一个新的和原来一模一样的对象。
这就是深拷贝,可以看到,我们在程序中使用了一个copy模块的函数deepcopy(),用它来完成深拷贝;其次,copy模块还有一个函数copy(),用它可以完成浅拷贝。
注意:1、非容器类型(比如数字、字符串和其他“原子”类型的对象等)没有深拷贝一说;
2、如果元组变量只包含原子类型对象(不可变对象),对它的深拷贝将不会进行,得到的就是浅拷贝。
相关文章推荐
- Python函数非匹配参数类型传递
- Python核心编程笔记---- print@2
- Python核心编程笔记---- print
- [Leetcode.python] 002. Add Two Numbers
- 为python添加tab自动补全功能
- eclipse配置python开发插件
- Python 模块的一般处理
- Python中四种运行其他程序的方式
- scrapy爬取豆瓣读书的图书信息
- Windows下搭建Python环境
- [Leetcode.python] 001. Two Sum
- python文件操作与输入输出
- ubuntu14.04 python2.7 安装配置OpenCV3.0
- Python socket编程之构造IP首部和ICMP首部
- python一些内置函数——filter、map、reduce
- python中List添加、删除元素的几种方法
- 搭建Python环境与Python文件类型
- [Python]新手写爬虫全过程(已完成)
- Python_Scrapy_8.爬虫
- Python中关于模块的 '__name__' 变量的使用