python 浅复制

    复制列表最简单的方式就是使用内置构造类型构造方法。

 


 

>>> l1 = [3, [55, 44], (7, 8, 9)]
>>> l2 = list(l1)                                       #list(l1)创键与源列表相等
>>> l2
[3, [55, 44], (7, 8, 9)]
>>> l2 == l1                                           #副本与源列表相等
True
>>> l2 is l1                                             #但是二者指代不同的对象
False


 

 

       对于列表和其他可变序列来说,可以使用 l2 = l1[ : ]语句创建副本。然而, 构造方法或[ : ]做的是浅复制,虽然复制了最外层的容器, 但副本中的元素是源容器中元素的引用。如果所有元素都是不可变的,这样没什么问题,还可以节约内存。但是如果有可变的元素,可能会有其他问题,下面举个浅复制的例子(为一个包含另一个列表的列表做浅复制)

>>> l1 = [3, [66, 55, 44], (7, 8, 9)]

>>> l2 = list(l1)                                     #l2是l1的浅复制副本。这个时候的状态如图一
>>> l1.append(100)                              #把100追加到l1中, 对l2没有影响
>>> l1[1].remove(55)                            #把内部列表l1[1]中的55删除。这对l2有影响,因为l2[1]绑定的列表与l1[1]是同一个
>>> print('l1:', l1)
l1: [3, [66, 44], (7, 8, 9), 100]
>>> print('l2:', l2)
l2: [3, [66, 44], (7, 8, 9)]
>>> l2[1] += [33, 22]                             #对可变对象来说,如l2[1]引用的列表, +=运算符就地修改列表。这次修改在l1[1]中也有体现, 因为它是l2[1]的别名。
>>> l2[2] += (10, 11)                             #对于元组来说, +=运算符创建一个新元组,然后重新绑定给变量l2[2]。等同于l2[2] = l2[2] + (10, 11)。现在, l1 和 l2最后位置                                                             # 元素不是同一个对象,见图2 
>>> print('l1:', l1)
l1: [3, [66, 44, 33, 22], (7, 8, 9), 100]
>>> print('l2:', l2)
l2: [3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]
>>>

 


 

图1

 l2 = list(l1)复制后的状态:

图2

l1和l2的最终状态:二者依然引用同一个列表对象,现在列表的值是[66, 44, 33, 22], 不过l2[2] += (10, 11)创建一个新元组,内容是(7, 8, 9, 10,11),它与l1[2]引用的元组(7,8, 9)无关。

posted @ 2017-10-31 21:03  arthurlzyw  阅读(142)  评论(0编辑  收藏  举报