变量的深拷贝、浅拷贝是项目中重要且不能忽视的问题。
Python
在python中进行数据处理时,会不时用到数组拷贝,如果不了解拷贝的数组是数组的别名还是深、浅拷贝,会花更多的时间排错。
在研究拷贝问题时,list和numpy的表现不完全一致。可以利用数组元素值是否改变及对应的内存地址是否改变来研究(用id()函数来查看内存地址),如下表。
当用等号为变量赋值时,相当于为变量取了一个别名,两者的内存首地址相同,元素地址对应相同,当改变其中一个元素时,另一个变量中跟着同时改变。
当使用遍历元素法(或切片)为新数组赋值,数组的id值是不同的,但对应的元素的地址相同,对于list,当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响;对于numpy,当为任意元素赋值后,元素地址不变,对另一个数组的对应元素有同样的改变。
当使用copy进行数组的复制,两个数组的id值不同,对应元素的地址相同,对于list,当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响;对于numpy,当为任意元素赋值后,元素地址不变,对另一个数组的对应元素没有影响(此处另一个数组元素内存地址没有变,但是在此基础上再拷贝出一个数组后,数组的对应元素的地址是发生改变的,所以之前内存地址应该有个指代关系?)。
当使用deepcopy进行数组的复制,两个数组的id值不同,对应元素的地址相同,对于list和numpy,当为任意元素赋值后,元素地址改变,对另一个数组的对应元素没有影响。
根据以上结果,在写Python时,可以使用copy()函数进行数组的复制,减少不必要的bug。
C++
数组不能有等号变量赋值,常见情况的等号赋值就是浅拷贝,对于复杂类等,里面有指针或者引用时,需要用深拷贝,解决内存释放导致的内存泄漏或者程序崩溃。
数组内存实例比较:
以上。
----------------
欢迎交流指正!