zoukankan      html  css  js  c++  java
  • 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是同赋值操作一样,数值同步的。

  • 相关阅读:
    JS高级---沙箱小案例
    JS高级---沙箱
    JS高级---闭包案例,点赞
    JS高级---闭包案例,产生多个相同的随机数
    JS高级---闭包小案例
    JS高级---闭包
    JS高级---作用域,作用域链和预解析
    JS高级---函数作为返回值使用拓展,排序
    JS高级---函数作为参数使用
    c# 格式化字符串
  • 原文地址:https://www.cnblogs.com/hongdanni/p/10458796.html
Copyright © 2011-2022 走看看