您的位置:首页 > 编程语言 > Python开发

Python对象之深拷贝、浅拷贝

2015-06-21 22:41 537 查看
“对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用。换句话说,这个拷贝的对象本身是新的,但是它的内容不是”

上面这段话摘自《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、如果元组变量只包含原子类型对象(不可变对象),对它的深拷贝将不会进行,得到的就是浅拷贝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: