[关闭]
@songying 2018-07-28T12:36:23.000000Z 字数 597 阅读 1063

python中的浅复制与深复制

python数据类型


浅复制

浅复制: 使用构造方法或[:],复制了最外层容器,副本中的元素是源容器中元素的引用,如果所有元素都是不可变的,那么这样没有问题,还能节省内存。但是,如果有可变的元素,可能就会导致意想不到的问题。举个简单的例子:

  1. l1 = [3, [66, 55, 44], (7, 8, 9)]
  2. l2 = list(l1)

此时, l2是l1的浅复制。l1和l2指代不同的列表,但是二者引用同一个列表 [66, 55, 44] 和元组 (7, 8, 9)。

  1. l1.append(100) # 在列表l1中追加,此时对l2是没有影响的。
  2. l1[1].remove(55) # 把内部列表l1[1]中的元素删除,这对l2会产生影响,因为l2[1] 与 l1[1]引用的是同一个列表

更神奇的还在后面:

  1. l2[1] += [33, 22] # 对于可变对象l2[1]来讲, += 就地更改该对象,这对l1[1]也产生了影响
  2. l2[2] += (10, 11) # 对于不可变对象元组来讲,+= 运算符创建一个新元组,然后重新绑定给变量 l2[2]。这等同于l2[2] = l2[2] + (10, 11)。现在,l1 和 l2 中最后位置上的元组不是同一个对象。

最终,l1和l2的状态如下:

深复制

深复制意味这副本不共享内部对象的引用, copy模块能够为任意对象做深复制和浅复制。

注意,一般来说,深复制不是件简单的事。如果对象有循环引用,那么这个朴素的算法会进入无限循环。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注