zoukankan      html  css  js  c++  java
  • 深拷贝与浅拷贝(c++和python)

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


    Python

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

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

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

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

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

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

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


    C++

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


    数组内存实例比较: 

    以上。

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

    欢迎交流指正!

  • 相关阅读:
    Developing
    debian 中的jdk
    openwrt手册编译
    下载openwrt源码
    progit 学习笔记-- 1 第一章 第二章
    nw335 debian sid x86-64 -- 6 第三方驱动
    nw335 debian sid x86-64 -- 5 使用xp的驱动
    nw335 debian sid x86-64 -- 4 realtek 提供的官方驱动
    JavaScript中介者模式
    javascript职责链模式
  • 原文地址:https://www.cnblogs.com/xiaoheizi-12345/p/14220210.html
Copyright © 2011-2022 走看看