直接赋值: 对象的引用,也就是给对象起别名
浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象。
深拷贝: 拷贝父对象. 以及其内部的子对象
在之前的文章中,提到可变对象和不可变对象,接下来也是以这两者的区别进行展开
直接赋值
对于可变对象和不可变对象,将一个变量直接赋值给另外一个变量,两者 id 值一致,其实本质上是将变量量绑定到对象的过程.
> a=1 > b=a > id(a) == id(b) True > c="string" > d=c > id(c) == id(d) True > e=[1,2,3] > f=e > id(e)==id(f) True
关于修改新变量的值,对原有变量会产生的影响,在可变对象和不可变对象 中也做了讲述,这里通过几个例子,重新温习一下
不可变对象
> x=1 > y=x > id(x)==id(y) True > id(1)==id(y) True id(x) 1500143776 > y=y+1 > y 2 > x 1 > id(x)==id(y) False > id(y) 1500143808 > id(x) 1500143776
对于不可变对象,修改赋值后的新变量,不会对原有变量造成任何影响.为什么出现这种现象呢"text-align: center">
可变对象
> m=[1,2,3] > n=m > id(n)==id(m) True > id(m) 1772066764488 > id(n[0]) 1772066764656 > n[0]=4 > n [4, 2, 3] > m [4, 2, 3] > id(n)==id(m) True > id(m) 1772066764488
对于可变对象,修改赋值后的变量,会对原有的变量造成影响,会导致其 value
值的改变,但是其id
值保持不变
从上图不难看出,这个时候的 id(n[0]) 的值,和未修改前的 id值应该不一样,可以输出看一下
>id(n[0]) 1772066764752 # 最初没有修改前是 1772066764656
n[0]
修改前后为什么 id 值出现改变呢"text-align: center">
从上图不难看出,浅拷贝后,新复合对象包含的对象(可变或者不可变)的 id 值和原有对象包含的对象的 id 值相同
看一下具体例子:
> import copy > a=[1,2,[3,4]] > b=copy.copy(a) > id(b[0])==id(a[0]) True > id(b[2])==id(a[2]) True > id(b[2][0])==id(a[2][0]) True
现在让我们试着修改一下浅拷贝后的 b
的值,在修改前,可以先思考一下,如果修改 b[0]
可能会发生什么?
由于 b[0] = 1
,很显然 1 属于不可变对象,那么根据对不可变变量修改的规则,则 b[0]
会绑定到新的变量上,而 a[0]
的由于没有修改,则保持不变,真的是这样吗?让我们验证一下
> b[0]=5 > b [5, 2, [3, 4]] > a [1, 2, [3, 4]]
接下来我们要尝试修改一下 b[2]
,由于 b[2]
绑定的对象是 list
,属于可变对象,按照上面说的可变对象修改的规则,则修改后的 b[2]
的 id
值保持不变,但是其 value
值会发生改变. 同样的让我们通过例子验证一下
> id(b[2]) 4300618568 > b[2][0]=6 > id(b[2]) 4300618568 > b [5, 2, [6, 4]] > a [1, 2, [6, 4]]
由于 b[2]
和 a[2]
绑定同一个可变对象,很显然对 b[2]
的修改同样会映射到 a[2]
上
深拷贝
深拷贝构建一个复合对象,然后递归的将原有复合包含的对象的副本插入到新的复合对象中
若上图所示,深拷贝后,新的复合对象包含的对象,若对象为不可变对象,则 id 值保持不变,若对象为可变对象,则 id 值发生改变
看一个例子:
> import copy > a=[1,2,[3,4]] > b=copy.deepcopy(a) > id(b[0])==id(a[0]) True > id(b[2])==id(a[0]) False > id(b[2][0])==id(a[2][0]) True
接下来让我们修改一下变量 b
,这里就不在修改不可变对象 b[0]
和 b[1]
了,因为结果很明显,对 a 不会产生任何影响,我们来修改 b[2]
,那么修改 b[2]
会对 a[2]
产生影响吗?很明显答案是不会,因为深拷贝就相当于克隆出了一个全新的个体,两者不再有任何关系
> b[2][0]=5 > b [1, 2, [5, 4]] > a [1, 2, [3, 4]]
以上就是详解Python直接赋值,深拷贝和浅拷贝的详细内容,更多关于Python直接赋值,深拷贝和浅拷贝的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】