700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python对象之深拷贝 浅拷贝

Python对象之深拷贝 浅拷贝

时间:2021-10-14 06:52:02

相关推荐

Python对象之深拷贝 浅拷贝

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

上面这段话摘自《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、如果元组变量只包含原子类型对象(不可变对象),对它的深拷贝将不会进行,得到的就是浅拷贝。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。