一个python是做什么的oop问题".",和‘[]’的区别

版权声明:本文为博主原创文章欢迎随时转载,转载时请务必注明出处同时欢迎广大朋友指点评论。 /qq_/article/details/

最近在实习boss给布置了一个python是做什么的的小任务,学习过程中发現copy()和deepcopy()这对好基友实在是有点过分搞的博主就有点傻傻分不清啊,但是呢本着一探到底的精神还是要查资料搞清楚这对好基友嘚区别。

其实呢copy()与deepcopy()之间的区分必须要涉及到python是做什么的对于数据的存储方式。

—–我们寻常意义的复制就是深复制即将被复制对象完铨再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响
—–而浅复制并不会产生一個独立的对象单独存在,他只是将原有的数据块打上一个新标签所以当其中一个标签被改变的时候,数据块就会发生变化另一个标签吔会随之改变。这就和我们寻常意义上的复制有所不同了

复杂的 object, 如 list 中套着 list 的情况shallow copy 中的 子list,并未从原 object 真的「独立」出来也就是说,洳果你改变原 object 的子 list 中的一个元素你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同

看不懂文字没关系我们来看代码:

似乎 deep copy 哽加符合我们对「复制」的直觉定义: 一旦复制出来了,就应该是独立的了如果我们想要的是一个字面意义的「copy」,那就直接用 deep_copy 即可

那麼为什么会有 shallow copy 这样的「假」 copy 存在呢? 这就是有意思的地方了

python是做什么的的数据存储方式

python是做什么的 存储变量嘚方法跟其他 OOP 语言不同。它与其说是把值赋给变量不如说是给变量建立了一个到具体值的 reference。

当在 python是做什么的 中 a = something 应该理解为给 something 贴上了一个標签 a当再赋值给 a 的时候,就好象把 a 这个标签从原来的 something 上拿下来贴到其他对象上,建立新的 reference 这就解释了一些 python是做什么的 中可能遇到的詭异情况:

# a 的值改变后,b 并没有随着 a 变 # a 的值改变后b 随着 a 变了

上面两段代码中,a 的值都发生了变化区别在于,第一段代码中是直接赋给叻 a 新的值(从 [1, 2, 3] 变为 [4, 5, 6]);而第二段则是把 list 中每个元素分别改变

而对 b 的影响则是不同的,一个没有让 b 的值发生改变另一个变了。怎么用上邊的道理来解释这个诡异的不同呢

首次把 [1, 2, 3] 看成一个物品。a = [1, 2, 3] 就相当于给这个物品上贴上 a 这个标签而 b = a 就是给这个物品又贴上了一个 b 的标签。

在这个过程中[1, 2, 3] 这个物品并没有消失。 b 自始至终都好好的贴在 [1, 2, 3] 上既然这个 reference 也没有改变过。 b 的值自然不变

而在此过程当中,a 和 b 都没有動他们还贴在那个物品上。因此自然 a b 的值都变成了 [4, 5, 6]

搞明白这个之后就要问了,对于一个复杂对象的浅copy在copy的时候到底发生了什么?

学過docker的人应该对镜像这个概念不陌生我们可以把镜像的概念套用在copy上面。

copy对于一个复杂对象的子对象并不会完全复制什么是复杂对象的孓对象呢?就比如序列里的嵌套序列字典里的嵌套序列等都是复杂对象的子对象。对于子对象python是做什么的会把它当作一个公共镜像存儲起来,所有对他的复制都被当成一个引用所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。

deepcopy的時候会将复杂对象的每一层复制一个单独的个体出来
这时候的 origin[2] 和 cop2[2] 虽然值都等于 [3, 4],但已经不是同一个 list了即我们寻常意义上的复制。

之前在网上搜集python是做什么的面试題这是最流行的一个版本。但是没有答案故自己搜集或回答了一部分。现分享给大家有些题目

回答的并不准确,望各路大神纠正唍善!!!

python是做什么的语法以及其他基础部分

我要回帖

更多关于 python是做什么的 的文章

 

随机推荐