• 深浅copy


    . 赋值运算
     1 s1 = [1, 2, 3, ["barry", "alex"]]
     2 s2 = s1
     3 
     4 s1[0] = 111
     5 print(s1)    # [111, 2, 3, ['barry', 'alex']]
     6 print(s2)    # [111, 2, 3, ['barry', 'alex']]
     7 
     8 s1[3][0] = "abc"
     9 print(s1)    # [111, 2, 3, ['abc', 'alex']]
    10 print(s2)    # [111, 2, 3, ['abc', 'alex']]
    11 
    12 s2[1] = "askj"
    13 print(s1)    # [111, 'askj', 3, ['abc', 'alex']]
    14 print(s2)    # [111, 'askj', 3, ['abc', 'alex']]
    15 
    16 # 由上面两个示例得知, 两个列表指向的是同一个内存地址
    17 # 所以它们是完全一样的,其中一个列表内元素的改变会导致另一个列表的改变
    
    
    . 浅拷贝 copy
     1 s3 = [1, "拷贝", True, (1, 2, 3), [123, "ak"]]
     2 s4 = s3.copy()
     3 
     4 print(id(s3), id(s4))
     5 # 2862385252936  2862385260296   id 不一样
     6 
     7 print(id(s3[1]), id(s4[1]))
     8 # 2862384610800  2862384610800   id 一样
     9 
    10 print(id(s3[-1])), id(s4[-1])
    11 # 2862385259720  2862385259720   id 一样
    12 
    13 print(id(s3[-2])), id(s4[-2])
    14 # 2862385086400  2862385086400   id 一样
    15 
    16 # 发现列表 s3 和 s4 在内存中指向不同的地址
    17 # 但是它们同一个索引位置的元素指向内存中同一个地址
    18 # 说明新列表中的元素与原列表中的元素是公用的
    19 #
    20 # 浅 copy 只是 copy 了一个外壳
    21
    22 a = [1, "da", [22, 33]]
    23 b = a.copy()
    24 a[-1].append(44)
    25 print(b) # [1, "da", [22, 33, 44]]
    26
    27 # 但是记住 a 和 b 的 id 是不一样的!
    27 # 因此对其中一个列表的增删改查不会影响另一个列表的元素
    28 # 比如接着上面
    29 a.append(33)
    30 print(a) # [1, "da", [22, 33,44], 33]
    31 print(b) # [1, "da", [22, 33, 44]]
    32 # 注意 a.append(33) 与 a[-1].append(44) 的区别!
    33 # 一个是给列表添加元素,另一个是给列表中的元素(即列表)里添加一个元素
    34
    35
    37 # 这里涉及到切片的相关知识
    38 l1 = [1, 2, 3, [22, 33]]
    39 l2 = l1[::]
    40 l1[-1].append(666)
    41 print(l2) # [1, 2, 3, [22, 33, 666]
    42 # 这说明对列表创建一个副本是 浅copy!

      . 深拷贝 deepcopy

     1 import copy
     2 
     3 s5 = [3, True, "ask", (1, 2, 3), [34, "as"]]
     4 s6 = copy.deepcopy(s5)
     5 
     6 print(id(s5), id(s6))  
     7 # 2862386662664  2862386819848
     8 
     9 print(id(s5[0]), id(s6[0]))  
    10 # 1409182528  1409182528
    11 
    12 print(id(s5[-1]), id(s6[-1]))  
    13 # 2862386662600  2862386819912
    14 
    15 print(id(s5[-2]), id(s6[-2]))  
    16 # 2862385217680  2862385217680
    17 
    18 # 对于深copy,列表是在内存中重新创建的。
    19 # 列表中可变的数据类型是重新创建的,列表中的不可变数据类型是公用的
    20
    21 # 注意这三个列表之间都算是深copy
    22 import copy
    23 a = [1, 2, [33, 44]]
    24 b = copy.deepcopy(a)
    25 c = [1, 2, [33, 44]]
    26 # 这三者中,可变的数据类型是重新创建的,不可变数据类型是公用的
  • 相关阅读:
    浅析 MySQL Replication(转)
    mysql优化案例
    create index 与 alter table add index 区别
    /etc/sysctl.conf参数解释(转)
    Linux内核 TCP/IP参数调优
    OneProxy常用参数说明
    转载:如何在面试中写出好的代码
    F面经:painting house
    Lintcode: Merge Sorted Array II
    Lintcode: Median
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10163886.html
Copyright © 2020-2023  润新知