• python浅拷贝和深拷贝


    >>> import copy
    >>> a = [0,1,2,[3,4]]
    >>> b = a  # 赋值
    >>> c = a[:]  #浅拷贝(又叫影子拷贝)
    >>> d = copy.copy(a)  #浅拷贝
    >>> e = a.copy()  #浅拷贝
    >>> f = copy.deepcopy(a)  # 深拷贝

    #父对象的修改

    >>> a.append(10)
    >>>a
    [0, 1, 2, [3, 4], 10]
    >>> b
    [0, 1, 2, [3, 4], 10]
    >>> c
    [0, 1, 2, [3, 4]]
    >>> d
    [0, 1, 2, [3, 4]]
    >>> e
    [0, 1, 2, [3, 4]]
    >>> f
    [0, 1, 2, [3, 4]]

    #子对象的修改

    >>> a[3].append(5)
    >>>a
    [0, 1, 2, [3, 4, 5], 10]
    >>> b
    [0, 1, 2, [3, 4, 5], 10]
    >>> c
    [0, 1, 2, [3, 4, 5]]
    >>> d
    [0, 1, 2, [3, 4, 5]]
    >>> e
    [0, 1, 2, [3, 4, 5]]
    >>> f
    [0, 1, 2, [3, 4]]

    由上面两个例子可以理解为并总结出:

    a = b赋值操作:就是将变量a的引用地址拷贝过去,即a的另一个别名;对a或者b的操作是对同一个地址下的元素进行操作,所以返回的结果都是一样的,数值同步

    f = copy.deepcopy()深拷贝:就是将父对象及父对象下的子对象的所有元素值都拷贝过去,对a或者对f的操作都是各自对不同地址下的元素进行操作,互不影响

    c = a[:],a.copy(),copy.copy(a)都是浅拷贝的形式:将变量a内的所有父对象的值拷贝过去,但是对于父对象内的子对象值(例如列表内的各个元素值)没有进行拷贝,只是拷贝了列表所指向的地址值。

    所以介于赋值操作和深拷贝之间:对于a或者c的父对象的操作,a和c是同深拷贝一样互不影响的;对于子对象的操作,a和c是同赋值操作一样,数值同步的。

  • 相关阅读:
    COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
    A Complete ActiveX Web Control Tutorial
    C++使用VARIANT实现二维数组的操作
    用户自定义结构数据与VARIANT转换
    VS2008中使用JSONCPP方法小结
    HDOJ 2030 汉字统计
    HDOJ 1312 (POJ 1979) Red and Black
    POJ 1503 Integer Inquiry 简单大数相加
    POJ 1936 All in All
    枚举法
  • 原文地址:https://www.cnblogs.com/hongdanni/p/10458796.html
Copyright © 2020-2023  润新知