深拷贝与浅拷贝(c++和python)

变量的深拷贝、浅拷贝是项目中重要且不能忽视的问题。


Python

  在python中进行数据处理时,会不时用到数组拷贝,如果不了解拷贝的数组是数组的别名还是深、浅拷贝,会花更多的时间排错。

  在研究拷贝问题时,listnumpy的表现不完全一致。可以利用数组元素值是否改变及对应的内存地址是否改变来研究(用id()函数来查看内存地址),如下表。

  当用等号为变量赋值时,相当于为变量取了一个别名,两者的内存首地址相同,元素地址对应相同,当改变其中一个元素时,另一个变量中跟着同时改变

  当使用遍历元素法(或切片)为新数组赋值,数组的id值是不同的,但对应的元素的地址相同,对于list,当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响;对于numpy当为任意元素赋值后,元素地址不变,对另一个数组的对应元素有同样的改变。

  当使用copy进行数组的复制,两个数组的id值不同,对应元素的地址相同对于list,当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响;对于numpy,当为任意元素赋值后,元素地址不变,对另一个数组的对应元素没有影响(此处另一个数组元素内存地址没有变,但是在此基础上再拷贝出一个数组后,数组的对应元素的地址是发生改变的,所以之前内存地址应该有个指代关系?

  当使用deepcopy进行数组的复制两个数组的id值不同,对应元素的地址相同,对于listnumpy当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响

   根据以上结果,在写Python时,可以使用copy()函数进行数组的复制,减少不必要的bug。


C++

  数组不能有等号变量赋值,常见情况的等号赋值就是浅拷贝,对于复杂类等,里面有指针或者引用时,需要用深拷贝,解决内存释放导致的内存泄漏或者程序崩溃。


数组内存实例比较: 

以上。

----------------

欢迎交流指正!

原文地址:https://www.cnblogs.com/xiaoheizi-12345/p/14220210.html