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]

    示意图:

  • 相关阅读:
    HTML浏览器标题栏如何设置
    阿里团队常用的布局——双飞翼布局
    浏览器兼容性问题——IE不支持却很实用的CSS属性Outline和Child
    css选择器:基本选择器
    编程十年
    解决WX-IOS打开公众号网页出现的底部导航条
    Angular6路由复用与延迟加载的冲突解决——看看有备无患
    Ionic2 + Angular4 + JSSDK开发中的若干问题汇总
    [Linq Expression]练习自己写绑定
    [Linq To Sql]解决join时的Collation冲突
  • 原文地址:https://www.cnblogs.com/love2000/p/14084237.html
Copyright © 2011-2022 走看看