python的浅拷贝和深拷贝

一、浅拷贝和深拷贝的作用简述

浅拷贝和深拷贝可以运用于不同的场景,比如一个夫妻联名账户,将账户的信息都放入一个对象中,夫妻两人的账户信息都通过这个对象拷贝而来(两人一人一个账号),但是任何一个人取出存款都会影响到对方账户中的存款值,这时他们对应的“账户信息”可以使用浅拷贝来处理,如果希望两个用户各自不会受到对方影响,那就是涉及到深拷贝。具体见下面的示例。

要知道浅拷贝和深拷贝的原理,最好先了解python的赋值原理,python中可谓一切皆指针,一切皆对象。另外不同的对象类型,其访问方式和更新模式不同,例如,字符串和数字就是直接访问,元组列表等是顺序访问。了解这些内容再学习浅拷贝和深拷贝会更容易。

图1. 基本对象的基础知识

二、浅拷贝(以下示例都是在python2中运行的)

作用简述中涉及到的示例如下:

>>> person = ['name', ['savings', 100.00]]

>>> hubby = person[:] # slice copy

>>> wifey = list(person) # fac func copy

>>> [id(x) for x in person, hubby, wifey] 

[11826320, 12223552, 11850936]

为他们创建了初始有$100 的个人存款帐户。用户名改为定制的名字。虽然我们进行了分开的拷贝,但是,当丈夫取走$50后,他的行为影响到了他妻子的账户(见下面部分),为什么会这样呢?

>>> hubby[0] = 'joe'

>>> wifey[0] = 'jane'

>>> hubby, wifey

(['joe', ['savings', 100.0]], ['jane', ['savings', 100.0]])

>>> hubby[1][1] = 50.00

>>> hubby, wifey

(['joe', ['savings', 50.0]], ['jane', ['savings', 50.0]])

另外,可以看到,虽然金额相互受到了影响,但是名称却可以各自设置,这是图1中显示的不同对象属性是否可更新影响,列表是一种可以更新的对象,但是字符串不是。同一个列表对象内容是可以更改的,但是每个不同的字符串都是一个新的字符串对象。

三、深拷贝


如果需要的是两个分离不受彼此影响的账户,就需要作些改动了.要得到一个完全拷贝或者说深拷贝--创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用--需要copy.deepcopy()函数.我们使用深拷贝来重写整个例子.

>>> person = ['name', ['savings', 100.00]]

>>> hubby = person

>>> import copy

>>> wifey = copy.deepcopy(person)

>>> [id(x) for x in person, hubby, wifey]

[12242056, 12242056, 12224232]

>>> hubby[0] = 'joe'

>>> wifey[0] = 'jane'

>>> hubby, wifey

(['joe', ['savings', 100.0]], ['jane', ['savings', 100.0]])

>>> hubby[1][1] = 50.00

>>> hubby, wifey

(['joe', ['savings', 50.0]], ['jane', ['savings', 100.0]])

这就是我们想要的方式,作为验证,让我们确认一下所有四个对象都是不同的.

>>> [id(x) for x in hubby]

[12191712, 11826280]

>>> [id(x) for x in wifey]

[12114080, 12224792]

以下有几点关于拷贝操作的警告。第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像code,type和xrange 对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的.第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.如果我们把账户信息改成元组类型,那么即便按我们的要求使用深拷贝操作也只能得到一个浅拷贝:

>>> person = ['name', ('savings', 100.00)]

>>> newPerson = copy.deepcopy(person)

>>> [id(x) for x in person, newPerson]

[12225352, 12226112]

>>> [id(x) for x in person]

[9919616, 11800088]

>>> [id(x) for x in newPerson]

[9919616, 11800088]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容