@songying
2018-07-28T12:36:23.000000Z
字数 597
阅读 1063
python数据类型
浅复制: 使用构造方法或[:],复制了最外层容器,副本中的元素是源容器中元素的引用,如果所有元素都是不可变的,那么这样没有问题,还能节省内存。但是,如果有可变的元素,可能就会导致意想不到的问题。举个简单的例子:
l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)
此时, l2是l1的浅复制。l1和l2指代不同的列表,但是二者引用同一个列表 [66, 55, 44] 和元组 (7, 8, 9)。
l1.append(100) # 在列表l1中追加,此时对l2是没有影响的。
l1[1].remove(55) # 把内部列表l1[1]中的元素删除,这对l2会产生影响,因为l2[1] 与 l1[1]引用的是同一个列表
更神奇的还在后面:
l2[1] += [33, 22] # 对于可变对象l2[1]来讲, += 就地更改该对象,这对l1[1]也产生了影响
l2[2] += (10, 11) # 对于不可变对象元组来讲,+= 运算符创建一个新元组,然后重新绑定给变量 l2[2]。这等同于l2[2] = l2[2] + (10, 11)。现在,l1 和 l2 中最后位置上的元组不是同一个对象。
最终,l1和l2的状态如下:
深复制意味这副本不共享内部对象的引用, copy模块能够为任意对象做深复制和浅复制。
注意,一般来说,深复制不是件简单的事。如果对象有循环引用,那么这个朴素的算法会进入无限循环。