zoukankan      html  css  js  c++  java
  • python 深浅拷贝&赋值

    1.赋值

    两者完全一样

    l1 = [1,2,[1,2,3]]
    l2 = l1
    
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    # l1[-1].append(3)
    l1[0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    l1[-1][0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    '''
    [1, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
    2362754916928 2362754916928
    140736584533664 2362754916416 140736584533664
    140736584533664 2362754916416 140736584533664
    [5, 2, [1, 2, 3]] [5, 2, [1, 2, 3]]
    2362754916928 2362754916928
    140736584533792 2362754916416 140736584533664
    140736584533792 2362754916416 140736584533664
    [5, 2, [5, 2, 3]] [5, 2, [5, 2, 3]]
    2362754916928 2362754916928
    140736584533792 2362754916416 140736584533792
    140736584533792 2362754916416 140736584533792
    '''

    2.浅拷贝

    对于列表来说,第一层不可变元素的改变不会影响另一个,但可变元素的子元素改变时,另一个随之改变;浅拷贝等于生成了一个新容器,但容器内的元素的内存地址还是指向原来的

    #浅拷贝是把原列表第一层的内存地址不加区分完全copy一份给新列表

    l1 = [1,2,[1,2,3]]
    l2 = l1.copy()
    
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    # l1[-1].append(3)
    l1[0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    l1[-1][0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    '''
    [1, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
    2971505058432 2971505129472
    140736584533664 2971505057920 140736584533664
    140736584533664 2971505057920 140736584533664
    [5, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
    2971505058432 2971505129472
    140736584533792 2971505057920 140736584533664
    140736584533664 2971505057920 140736584533664
    [5, 2, [5, 2, 3]] [1, 2, [5, 2, 3]]
    2971505058432 2971505129472
    140736584533792 2971505057920 140736584533792
    140736584533664 2971505057920 140736584533792
    '''

    3.深拷贝,把可变类型和不可变类型元素区分对待,不可变元素拷贝后id不变,可变元素id改变;深拷贝使新生成的列表和旧列表的改操作完全隔离,不会相互影响

    import copy
    l1 = [1,2,[1,2,3]]
    l2 = copy.deepcopy(l1)
    
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    # l1[-1].append(3)
    l1[0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    l1[-1][0]=5
    print(l1,l2)
    print(id(l1),id(l2))
    print(id(l1[0]),id(l1[-1]),id(l1[-1][0]))
    print(id(l2[0]),id(l2[-1]),id(l2[-1][0]))
    '''
    [1, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
    2913013588608 2913013659584
    140736584533664 2913013588096 140736584533664
    140736584533664 2913013658240 140736584533664
    [5, 2, [1, 2, 3]] [1, 2, [1, 2, 3]]
    2913013588608 2913013659584
    140736584533792 2913013588096 140736584533664
    140736584533664 2913013658240 140736584533664
    [5, 2, [5, 2, 3]] [1, 2, [1, 2, 3]]
    2913013588608 2913013659584
    140736584533792 2913013588096 140736584533792
    140736584533664 2913013658240 140736584533664
    '''
  • 相关阅读:
    Linux RAID部署
    系统运维架构师体系
    Linux系统上文件的特殊权限及文件acl
    Linux磁盘使用及文件系统管理
    中小规模网站架构组成
    优化配置模板主机
    网络原理基础
    MySQL二进制安装
    网络通讯基础
    点击改变背景
  • 原文地址:https://www.cnblogs.com/thanos-ryan/p/14295836.html
Copyright © 2011-2022 走看看