• list浅拷贝问题解析


    一、列表浅拷贝演示

    列表的浅拷贝的产生

    列表的浅拷贝的检查

    什么样的操作会继续共享浅拷贝

    什么样的操作会破坏共享浅拷贝

    #============================================================================
    #针对列表进行append,remove等操作不会破坏浅拷贝两个列表一同更新
    #针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
    #针对中间一个列表进行复制 会重新设置id 破坏浅拷贝 之后两个列表无关
    print("===="*5,"等于所带来浅拷贝")
    list1 = [1,2,3]
    list2 = list1
    print("after = ======")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1.remove(3)
    print("after remove=====")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1.append(3)
    print("after append=====")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1[1] = 0
    print("after ele init ==")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1[1] = [3,4]
    print("after ele init ==")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1[0] = [1,2]
    print("after ele init ==")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    list1 = [1,2,3,4]#重新赋值时候浅拷贝无效 id change
    print("after list init ==")
    print("打印list1:",list1)
    print("打印list2:",list2)
    print("List1地址:",id(list1))
    print("List2地址:",id(list2))
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48


    二、列表乘法所带来的浅拷贝

    #针对列表的乘法后赋值不会升维度
    #针对列表的乘法后在外面加上[]就会升维度
    #第二种乘法会有浅拷贝 相同列表经过乘法作为被赋值列表的重复元素
    print("===="*5,"一维乘法操作所带来浅拷贝")
    list1 = [1,2,3]
    print("打印list1:",list1)
    #一个列表的所有元素所能索引到的id是不一样的
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1 = [0]*3
    print("打印list1:",list1)
    #乘法之后一个列表的所有数组所能索引到的id是一样的
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0] = 1
    #此处如上元素之间地址相同但是对某一个元素重新赋值就会破坏浅拷贝
    #因为元素已经是最小单位,一经赋值就会破坏浅拷贝
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1 = [1,2,3]*3
    print("打印list1:",list1)
    #乘法之后一个列表的所有数组所能索引到的id是一样的
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0] = 100
    #此处如上元素之间地址相同但是对某一个元素重新赋值就会破坏浅拷贝
    #因为元素已经是最小单位,一经赋值就会破坏浅拷贝
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35


    三、二维乘法操作带来横向浅拷贝

    print("===="*5,"二维乘法操作所带来横向浅拷贝")
    #针对列表进行append,remove等操作不会破坏浅拷贝两个列表一同更新
    #针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
    #针对浅拷贝中间一个列表进行复制 会重新设置id 破坏浅拷贝 之后两个列表无关
    list1 = [[0]]*3
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0].append(1)
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0][0] = 100
    #针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0] = 100
    #针对浅拷贝中间一个列表进行复制 会重新设置id 破坏浅拷贝 之后两个列表无关
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26


    四、二维乘法操作所带来纵向浅拷贝

    print("===="*5,"二维乘法操作所带来纵向浅拷贝")
    list1 = [[0]*2]*3
    #横向间为元素的赋值 可以看作没有浅拷贝 纵向间可以看作有浅拷贝
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0].append(3)
    print("打印list1:",list1)
    list1[1][1] = [1,2] #对浅拷贝内的元素进行重新复制可行
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0][1]))
    print("List1[1]地址:",id(list1[1][1]))
    print("List1[2]地址:",id(list1[2][1]))
    list1[1][1][0] = 0 #对浅拷贝内的元素进行重新复制可行
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0][1]))
    print("List1[1]地址:",id(list1[1][1]))
    print("List1[2]地址:",id(list1[2][1]))
    list1[0][1] = 100 #对浅拷贝内的元素进行重新复制可行
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    list1[0] = 100 #对浅拷贝列表重新赋值时候浅拷贝无效
    #对整个列表进行append等list函数以外的赋值操作则地址会改变 浅拷贝就不存在了
    print("打印list1:",list1)
    print("List1[0]地址:",id(list1[0]))
    print("List1[1]地址:",id(list1[1]))
    print("List1[2]地址:",id(list1[2]))
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    ---------------------

  • 相关阅读:
    NSArray的枚举使用方法
    NSArray的创建(一)
    关于Description的一些理解
    NSString的形式--可变字符串--改方法Alter
    iOS音频流播放、后台播放、远程控制、锁屏封面等总结
    10个重要的算法C语言实现源代码
    OC方法积累
    UIDevice获取设备数据以及如何获取应用信息
    iOS如何取得APP的版本信息跟Apple服务器对比进行升级提示?
    新浪微博-开发过程
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11198594.html
Copyright © 2020-2023  润新知