zoukankan      html  css  js  c++  java
  • python中浅拷贝与深拷贝

    python中浅拷贝与深拷贝

    1,浅拷贝(copy)

    浅拷贝,拷贝的是父对象,不会拷贝到内部的子对象。(单从一个浅字就可以看出他拷贝的东西不深,可以理解为只拷贝一层)

    import copy
    a = [1,"ss",[2,3],{"xi":18}]
    b = copy.copy(a)
    print(b)
    print(id(a))
    print(id(b))

    现在有一个列表a里面有数字,字符串,列表和字典 用浅拷贝的方法给到b 现在打印下b的内容 和a,b的内存地址

     可以看到 内容一样但是内存地址不一样 换另外一种比较方式看看

    import copy
    a = [1,"ss",[2,3],{"xi":18},(2,3)]
    b = copy.copy(a)
    print(id(a[1]))
    print(id(b[1]))
    print(id(a[2]))
    print(id(b[2]))

    比较列表下任何一个子元素 他们的内存地址都是一样的

     可以看到内存地址都是一样的

    import copy
    a = [1,"ss",[2,3],{"xi":18},(2,3)]
    b = copy.copy(a)
    a.append(50)
    print(a)
    print(b)

    现在向列表中添加一个数据看看b发生改变没

     可以看到b没有发生改变

    import copy
    a = [1,"ss",[2,3],{"xi":18},(2,3)]
    b = copy.copy(a)
    a[1]="haha"
    a[2].append(80)
    print(a)
    print(b)

    现在改变不可变类型字符串的值,在向可变数据类型列表加入一个新值 打印一哈

     可以看到可变数据类型更改了之后 b随着a 的改变而改变了  给不可变数据类型赋值后 b 还是指向了ss这个值

    示意图:

     唯一要注意的是如果是元组的拷贝的话 内存地址是一样的

    a = (1, "ss", [2, 3], {"xi": 18}, (2, 3))
    b = copy.copy(a)
    print(id(a))
    print(id(b))

    2.深拷贝(deepcopy)

    深拷贝,包含对象里面的自对象的拷贝(可以理解为克隆,全拷贝过去但是两者没有任何关系了,各玩各的),所以原始对象的改变不会造成深拷贝里任何子元素的改变

    import copy
    a=[1,2,[3,4],5]
    b=copy.deepcopy(a)
    print(b)
    # 结果为 [1,2,[3,4],5]
    # 接下来我们更改a的数据
    a.append(6)
    print(a)
    print(b)
    # 结果为 [1,2,[3,4],5,6]和[1,2,[3,4],5]
    # 可以发现浅层的数据更改(第一层)并没有让b发生变化
    # 接下来进行子对象数据(深层数据)的更改
    a[2].append(7)
    print(a)
    print(b)
    # 结果为 [1,2,[3,4,7],5,6]和[1,2,[3,4],5]

    示意图:

  • 相关阅读:
    大数据架构师技能图谱
    2018年,Java程序员转型大数据开发,是不是一个好选择?
    如何将java web项目上线/部署到公网
    Flume调优
    Spark流处理调优步骤
    zookeeper的WEB客户端zkui使用
    HBase各版本对Hadoop版本的支持情况
    java 代码实现使用Druid 链接池获取数据库链接
    安装postgreSQL出现configure: error: zlib library not found解决方法
    修改postgres密码
  • 原文地址:https://www.cnblogs.com/love2000/p/14084237.html
Copyright © 2011-2022 走看看