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]

    示意图:

  • 相关阅读:
    git小乌龟的使用
    C语言笔记(二):数据类型(基本数据类型)、类型转换(自动转换、强制转换)
    Edge Chromium 中如何始终允许运行 Flash 内容
    【DTOJ】2704:数字互换
    【DTOJ】2703:两个数的余数和商
    【DTOJ】1001:长方形周长和面积
    Linux_simpl shell-利用Shell脚本for循环输出系统中的用户及其Shell
    Linux_Centos7安装VNC实现远程桌面
    Linux_crontab参数表示的意思
    Docke部署nginx并配置nginx
  • 原文地址:https://www.cnblogs.com/love2000/p/14084237.html
Copyright © 2011-2022 走看看