Python默认是浅拷贝,比如使用拷贝一个列表l1 使用l2=list(l1) 或者l2=l1[:] 都是浅拷贝。 (l2=l1这不是拷贝,这是别名,多了一个引用)
浅拷贝:只复制了最外层的容器,副本中的元素是源容器中元素的引用。如果所有元素都是不可变的,那么这样没问题,还能节省内存。但是浅拷贝中有可变的元素,会导致很多想不到的问题。
l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1) # 浅拷贝,此时l1 is l2 = FALSE
l1.append(100) # 对l2没有英雄
l1[1].remove(55) # 对l2有影响,因为l1[1]和l2[1]绑定的列表是同一个
print(l1)
print(l2)
l2[1] += [33, 22] # +=可变类型来说,会就地修改列表。l1和l2都引用了这个列表
l2[2] += (10, 11) # +=对于元组这种不可变类型,会创建一个新的元组,然后重新绑定给变量l2[2]。此时l1和l2最后一个元组不是同一个对象了。
print(l1)
print(l2)
打印
[3, [66, 44], (7, 8, 9), 100]
[3, [66, 44], (7, 8, 9)]
[3, [66, 44, 33, 22], (7, 8, 9), 100]
[3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]
知识点:
+=增量赋值运算符,对于列表来说,会修改原列表。对于元组这种不可变序列,会创建一个新的元组。
深拷贝:拷贝的副本不共享内部对象的引用。