zoukankan      html  css  js  c++  java
  • Python 标准类库-数据类型之copy-深拷贝浅拷贝操作

    标准类库-数据类型之copy-深拷贝浅拷贝操作

     

    by:授客 QQ1033553122

    Python中赋值并不会拷贝对象,只是创建目标和对象的绑定关系。

     

    copy.copy(x)

    返回x的浅拷贝

     

    copy.deepcopy(x)

    返回x的深拷贝

     

    exception copy.error

    抛出模块指定的错误

    例子

    >>> import copy

    >>> lista = [["hi", "shouke"], 2018]

    >>> listb = copy.copy(lista)

    >>> id(lista), id(listb)

    (40713288, 51361160)

    >>> for item in lista:

    ...      print(id(item))

    ...

    51361032

    3944400

    >>> for item in listb:

    ...      print(id(item))

    ...

    51361032

    3944400

    如上,浅拷贝,拷贝的对象及被拷贝对象(例中分别为listb lista)id都不一样,但是两者所拥有的元素对象的id值是一样的


    对比试验

    >>> listb = copy.deepcopy(lista)

    >>> for item in listb:

    ...      print(id(item))

    ...

    51300488

    3944400

     

    如上,深拷贝,拷贝的对象及被拷贝对象(例中分别为listb lista)id都不一样,两者所拥有的元素对象的id值:

    1)如果是不可变对象,比如例中的整数,两者的id一样

    2)如果是可变对象,比如例子中的列表(["hi", "shouke"]),则两者的id值不一样。

     

    修改被拷贝对象的元素对象

    >>> lista[0].append('nihao')

    >>> lista

    [['hi', 'shouke', 'nihao'], 2018]

    >>> listb

    [['hi', 'shouke'], 2018]

     

    如上,深拷贝,拷贝的对象及被拷贝对象两者互不影响

     

    对比试验

    >>> listb = copy.copy(lista)

    >>> lista[0].remove('nihao')

    >>> lista

    [['hi', 'shouke'], 2018]

    >>> listb

    [['hi', 'shouke'], 2018]

    >>> lista[0].append('nihao')

    >>> lista

    [['hi', 'shouke', 'nihao'], 2018]

    >>> listb

    [['hi', 'shouke', 'nihao'], 2018]

     

    如上,类似c语言,浅拷贝,被拷贝对象拥有可变元素对象时,拷贝的对象及被拷贝对象两者会相互影响

     

     

     

     

     

     

     

     

  • 相关阅读:
    【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
    【BZOJ1003】【ZJOI2006】物流运输
    【BZOJ1001】狼抓兔子
    【对noip结束后一个月内的总结】
    floyd原理以及求最小环
    三角形面积求法
    6、task,线程和executor间的关系
    [leetcode]Valid Sudoku
    [leetcode]Search Insert Position
    rand5()产生rand7()
  • 原文地址:https://www.cnblogs.com/shouke/p/10157495.html
Copyright © 2011-2022 走看看