神剑山庄资源网 Design By www.hcban.com

直接赋值: 对象的引用,也就是给对象起别名
浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象。
深拷贝: 拷贝父对象. 以及其内部的子对象

在之前的文章中,提到可变对象和不可变对象,接下来也是以这两者的区别进行展开

直接赋值

对于可变对象和不可变对象,将一个变量直接赋值给另外一个变量,两者 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">详解Python直接赋值,深拷贝和浅拷贝

可变对象

> 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 值保持不变

详解Python直接赋值,深拷贝和浅拷贝

从上图不难看出,这个时候的 id(n[0]) 的值,和未修改前的 id值应该不一样,可以输出看一下

>id(n[0])
1772066764752 # 最初没有修改前是 1772066764656

n[0] 修改前后为什么 id 值出现改变呢"text-align: center">详解Python直接赋值,深拷贝和浅拷贝

从上图不难看出,浅拷贝后,新复合对象包含的对象(可变或者不可变)的 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]

深拷贝

深拷贝构建一个复合对象,然后递归的将原有复合包含的对象的副本插入到新的复合对象中

详解Python直接赋值,深拷贝和浅拷贝

若上图所示,深拷贝后,新的复合对象包含的对象,若对象为不可变对象,则 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直接赋值,深拷贝和浅拷贝的资料请关注其它相关文章!

标签:
Python,直接赋值,Python,深拷贝,Python,浅拷贝

神剑山庄资源网 Design By www.hcban.com
神剑山庄资源网 免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
神剑山庄资源网 Design By www.hcban.com

评论“详解Python直接赋值,深拷贝和浅拷贝”

暂无详解Python直接赋值,深拷贝和浅拷贝的评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。