zoukankan      html  css  js  c++  java
  • copy-浅及深的复制操作

    一、浅拷贝:copy.copy

    copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。

    1)元组形式:

    import copy
    a=[1,2,3]
    b=[4,5,6]
    c=(a,b)
    e=copy.copy(c)
    print(c[0])#[1, 2, 3]
    print(e[0])#[1, 2, 3]
    a.append(4)
    print(c[0])#[1, 2, 3, 4]
    print(e[0])#[1, 2, 3, 4]
    print(id(c))#61398072
    print(id(e))#61398072
    print(c is e)#True

    可以看到:e和c是指向了同一个地址

    列表形式:

    import copy
    a=[1,2,3]
    b=[4,5,6]
    c=[a,b]
    e=copy.copy(c)
    print(c[0])#[1, 2, 3]
    print(e[0])#[1, 2, 3]
    a.append(4)
    print(c[0])#[1, 2, 3, 4]
    print(e[0])#[1, 2, 3, 4]
    print(id(c))#51304688
    print(id(e))#51304768
    print(c is e)#False

    可以看到:c和e指向了不同的地址,但是c和e里面的内容是指向了相同的地址

    2)深拷贝:

    deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来,deep copy 更加符合我们对「复制」的直觉定义: 一旦复制出来了,就应该是独立的了。如果我们想要的是一个字面意义的「copy」,那就直接用 deep_copy 即可

    元组形式:

    import copy
    a=[1,2,3]
    b=[4,5,6]
    c=(a,b)
    e=copy.deepcopy(c)
    print(c[0])#[1, 2, 3]
    print(e[0])#[1, 2, 3]
    a.append(4)
    print(c[0])#[1, 2, 3, 4]
    print(e[0])#[1, 2, 3]
    print(id(c))#61132032
    print(id(e))#66655976
    print(c is e)#False

    列表形式:

    import copy
    a=[1,2,3]
    b=[4,5,6]
    c=[a,b]
    e=copy.deepcopy(c)
    print(c[0])#[1, 2, 3]
    print(e[0])#[1, 2, 3]
    a.append(4)
    print(c[0])#[1, 2, 3, 4]
    print(e[0])#[1, 2, 3]
    print(id(c))#52553888
    print(id(e))#52553968
    print(c is e)#False

    c和e指向了不同的地址,但是c和e里面的内容也指向了不相同的地址

  • 相关阅读:
    像素图生成向量图的算法
    黑白图着色(转换成彩色图片)的算法
    JavaScript的DOM编程--12--innerHTML属性
    JavaScript的DOM编程--11--插入节点
    JavaScript的DOM编程--10--删除节点
    JavaScript的DOM编程--09--节点的替换
    js中return、return true、return false的区别
    JavaScript的DOM编程--08--复习
    JavaScript的DOM编程--07--节点的属性
    JavaScript的DOM编程--06--两个实验
  • 原文地址:https://www.cnblogs.com/bashliuhe/p/12498133.html
Copyright © 2011-2022 走看看