when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.
写 python 的过程中,拷贝总是少不了的,遥记得 C++ 里有个东西叫深拷贝(总之涉及到指针就变得啥都不好理解了),同为面向对象,但是 python 不是没有指针吗?
这还得从 python 的变量开始说起
在 Python 中,一个变量可以说是内存中的一个对象的 “标签” 或 “引用”,它指向内存中的对象,当一个对象没有任何标签或引用指向它时,它就会被自动释放
1 | a = 1 # 现在变量 a 指向内存中的一个 int 型的对象(a 相当于 1 的名字) |
综上,变量不需要类型,类型是属于对象的,这也是 Python 中的变量可以被任何类型赋值的原因
Python 使用对象模型来储存数据,任何类型的值都是一个对象。所有的 python 对象都有 3 个特征:身份、类型、值
身份:每一个对象都有自己的唯一的标识,可以使用内建函数 id() 来得到它。这个值可以被认为是该对象的内存地址
类型:对象的类型决定了该对象可以保存的什么类型的值,可以进行什么操作,以及遵循什么样的规则。type()函数来查看 python 对象的类型
值:对象表示的数据项
1 | a = 1 |
Python 3 中有 6 种标准的数据类型:Numbers、Strings、List、Tuple、Sets、Dictionaries,其中 Numbers、Strings 和 Tuple 是不可更改的对象,而 List、Dictionaries 是可以修改的对象,那么可变与不可变有什么区别呢?
1 | # 不可变对象 |
在深拷贝之前,得先知道什么是浅拷贝
浅拷贝是指创建一个新的对象,其内容是原对象中元素的引用(拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作、工厂函数、对象的 copy() 方法、copy 模块中的 copy 函数
1 | a = [1, 2, 3] |
深拷贝是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联
1 | a = [1, 2, 3] |
为什么使用了深拷贝,a 和 c 中元素的 id 还是一样呢?
因为对于不可变对象,当需要一个新的对象时,python 可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 c 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个
1 | import copy |
此时,对于可变对象而言,浅拷贝带来的潜在隐患就一目了然了
be yourself, everyone else is already taken.