Python---copy()、deepcopy()与赋值的区别
2018-01-07 16:52
239 查看
首先直接上结论:
—–深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
—–而等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
—–而浅复制要分两种情况进行讨论:
1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。原值改变,新值不改变。
2)当浅复制的值是可变对象(列表和字典)时会产生一个“不是那么独立的对象”存在。有两种情况:
第一种情况:复制的 对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有复杂子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。但是改变原来的值中的复杂子对象的值,会影响浅复制的值。同理,修改浅复制对象中的子对象的值,也会影响原来的值。
即:
对于简单的 object,例如不可变对象(数值,字符串,元组),用 shallow copy 和 deep copy 没区别。
复杂的 object,如 list 中套着list 的情况,shallow copy中的子list,并未从原 object 真的独立出来。也就是说,如果你改变原object的子list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对复制的理解不同。
—–深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
—–而等于赋值,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
—–而浅复制要分两种情况进行讨论:
1)当浅复制的值是不可变对象(数值,字符串,元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。原值改变,新值不改变。
2)当浅复制的值是可变对象(列表和字典)时会产生一个“不是那么独立的对象”存在。有两种情况:
第一种情况:复制的 对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
第二种情况:复制的对象中有复杂子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,浅复制的值改变并不会影响原来的值。但是改变原来的值中的复杂子对象的值,会影响浅复制的值。同理,修改浅复制对象中的子对象的值,也会影响原来的值。
即:
对于简单的 object,例如不可变对象(数值,字符串,元组),用 shallow copy 和 deep copy 没区别。
复杂的 object,如 list 中套着list 的情况,shallow copy中的子list,并未从原 object 真的独立出来。也就是说,如果你改变原object的子list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对复制的理解不同。
相关文章推荐
- Python---copy()、deepcopy()与赋值的区别
- 【Python】copy()与deepcopy()的区别
- python 中copy和deepcopy的区别
- Python中copy()和deepcopy()的区别
- python的copy和deepcopy的区别
- Python中copy和deepcopy的区别,以及编程实现deepcopy的功能
- Python中的引用,copy和deepcopy的区别
- Python字典方法copy()和deepcopy()的区别
- 从python中copy与deepcopy的区别看python引用
- Python copy与deepcopy的区别
- Python-copy()与deepcopy()区别
- 从python中copy与deepcopy的区别看python引用
- Python-copy()与deepcopy()区别
- Python中 copy, deepcopy 的区别
- 从python中copy与deepcopy的区别看python引用
- Python-copy()与deepcopy()区别
- python中copy()与deepcopy()的区别小结
- 从python中copy与deepcopy的区别看python引用
- Python copy()与deepcopy()区别,深拷贝与浅拷贝
- Python-copy()与deepcopy()区别