zoukankan      html  css  js  c++  java
  • python中的浅拷贝与深拷贝——copy()

    1、copy()方法用来拷贝列表元素

    1 a = [1, 2, 3]
    2 # 拷贝
    3 b = a.copy()
    4 print('a = ', a, '
    ', 'b = ', b)
    5 
    6 # 执行结果:
    7 # a = [1, 2, 3] 
    8 # b = [1, 2, 3]

    2、copy()方法执行的是深拷贝,b = a.copy(),b将指代内存中的另一个与a不同的位置, 在不存在列表嵌套的情况下,在a或者b任何一方的任何操作对另一方没有影响

     1 a = [1, 2, 3]
     2 # 拷贝
     3 b = a.copy()
     4 print('a = ', a, '
    ', 'b = ', b)
     5 
     6 #修改a[0]和b[1]的值
     7 a[0] = 0
     8 b[1] = 1
     9 print('a = ', a, '
    ', 'b = ', b)
    10 
    11 
    12 # 执行结果:
    13 # a = [1, 2, 3]
    14 # b = [1, 2, 3]
    15 
    16 # 修改a[0]和b[1]后:
    17 # a =  [0, 2, 3] 
    18 # b =  [1, 1, 3]

    3、存在列表嵌套情况下的copy(),结果与情况2有不同

     1 a = [1, [2, 2, 2], 3]
     2 # 拷贝
     3 b = a.copy()
     4 print('a = ', a, '
    ', 'b = ', b)
     5 
     6 #修改a[1][0]、b[1][2]和b[2]的值
     7 a[1][0] = 0
     8 b[1][2] = 0
     9 b[2] = 1
    10 print('a = ', a, '
    ', 'b = ', b)
    11 
    12 
    13 # 执行结果:
    14 # a =  [1, [2, 2, 2], 3] 
    15 # b =  [1, [2, 2, 2], 3]
    16 
    17 # 修改a[1][0]、b[1][2]和b[2]后:
    18 # a =  [1, [0, 2, 0], 3] 
    19 # b =  [1, [0, 2, 0], 1]

    可以看见,凡是对列表内嵌套的列表的值进行了修改,那么无论修改a还是b都会对另一方有影响,如修改a[1][0]和b[1][2]则a和b的[1][0]和[1][2]位置的值都被修改了,而非嵌套列表的值则无影响,如修改b[2]对a[2]的值没有影响。

    出现这种情况的原因是,主列表a只存储了嵌套列表在内存中的地址,而不是嵌套列表的数据,copy()方法也只是将该地址复制到b中,但是由于a和b的这两个地址都指向内存的同一区域,故对该区域的任何操作都会对a和b有共同影响

    4、有一个copy模块提供与python内置的copy()方法相同的功能

     1 import copy
     2 
     3 a = [1, [2, 2, 2], 3]
     4 # 调用copy模块的copy函数
     5 b = copy.copy(a)
     6 print('a = ', a, '
    ', 'b = ', b)
     7 
     8 #修改a[1][0]、b[1][2]和b[2]的值
     9 a[1][0] = 0
    10 b[1][2] = 0
    11 b[2] = 1
    12 print('a = ', a, '
    ', 'b = ', b)
    13 
    14 
    15 # 执行结果:
    16 # a =  [1, [2, 2, 2], 3]
    17 # b =  [1, [2, 2, 2], 3]
    18 
    19 #修改a[1][0]、b[1][2]和b[2]后:
    20 # a =  [1, [0, 2, 0], 3]
    21 # b =  [1, [0, 2, 0], 1]

    5、可使用copy模块的deepcopy()方法进行彻底的深度拷贝,即不管有没有列表嵌套,在任何一方的任何操作都对另一方没有影响

     1 import copy
     2 
     3 a = [1, [2, 2, 2], 3]
     4 # 调用copy模块的deepcopy函数
     5 b = copy.deepcopy(a)
     6 print('a = ', a, '
    ', 'b = ', b)
     7 
     8 #修改a[1][0]、b[1][2]和b[2]的值
     9 a[1][0] = 0
    10 b[1][2] = 0
    11 b[2] = 1
    12 print('a = ', a, '
    ', 'b = ', b)
    13 
    14 
    15 # 执行结果:
    16 # a =  [1, [2, 2, 2], 3]
    17 # b =  [1, [2, 2, 2], 3]
    18 
    19 #修改a[1][0]、b[1][2]和b[2]后:
    20 # a =  [1, [0, 2, 2], 3]
    21 # b =  [1, [2, 2, 0], 1]

    参考自:https://blog.csdn.net/lhw413/article/details/72807834

  • 相关阅读:
    StopAllSounds
    GotoAndPlay
    区间(interval)
    因数(factor)
    [HAOI2009]逆序对数列
    生物分子gene
    数轴line
    [SCOI2008]配对
    精力(power)
    bzoj4987: Tree(树形dp)
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/9573051.html
Copyright © 2011-2022 走看看