Python 中 deepcopy, copy, 赋值的区别
Python 中数据对象分为三类,一类是不可变对象,如元组、字符串、数值;一类为单层可变对象,如列表 L = [1, 2, 3],字典 D = {‘x’: 1, ‘y’: 2};最后一类是多层可变对象,即可变对象中嵌套有可变对象,如列表 L = [1, [1, 2], 3],字典 D = {‘x’: [1, 2], ‘y’ = 3}。
Python 中拷贝也分为三类, 一类是赋值 ‘=’; 一类是浅层拷贝 copy.copy(); 一类是深层拷贝 copy.deepcopy(),它们表现了对数据操作的不同程度。赋值’=’是对数据对象“打上标签”, 而不对具体的数值操作,是一种指向操作。深层拷贝是真正意义上的拷贝一份,创造出两个完全意义的数据对象,在内存中开辟一个空间来存储数值。浅层拷贝对于对于不可变对象和单层可变对象开辟一个内存空间来存储数值,但是只存储“一层”,对于多层可变对象数据,不能够嵌套拷贝,因为嵌套的可变对象在多层可变对象中是以索引或标签的形式存储的。
举一些例子:
对于固定值的不可变对象,三者一样
1 | import copy |
1 | 94442834912000 |
对于单层可变对象,三者不同
1 | x = [1, 2, 3] |
1 | 139621304194544 |
对于多层可变对象,三者不同
1 | x = [1, [1, 2], 3] |
1 | 139621669999392 |
多层可变对象,deepcopy() 和 copy() 的区别
1 | x = [1, [1, 2], 3] |
1 | x = [1, [9, 2], 3] |
补充参考 csdn
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J. Xu!
评论