《流畅的 Python》8.3 默认做浅复制 读书笔记
复制列表对象时,如果列表对象中包含其他列表对象,那么应该复制内部列表对象吗?可以共享内部列表对象吗?
- 默认浅复制,复制列表对象时,如果列表对象中包含其他列表对象,共享内部列表对象。
- 使用深复制时,复制列表对象时,如果列表对象中包含其他列表对象,复制内部列表对象。
浅复制:
列表用 list 或者 [:] 创建副本的时候,
对于列表中的可变对象(list)只会拷贝值引用,不会拷贝完整的对象。
对于列表中的不可变对象(tuple)只会拷贝值引用。
对于列表中的字符,会拷贝完整的对象。
深复制:
使用 copy.deepcopy 创建副本时,
对于列表中的可变对象(list)会拷贝完整的对象。
对于列表中的不可变对象(tuple)只会拷贝值引用。
对于列表中的字符,会拷贝完整的对象。
浅复制与深复制图示对比工具:
http://www.pythontutor.com/visualize.html#mode=edit
浅复制过程图示:
l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = list(l1)
l1.append(100)
l1[1].remove(55)
print('l1:', l1)
print('l2:', l2)
l2[1] += [33, 22]
l2[2] += (10, 11)
print('l1:', l1)
print('l2:', l2)
对元组来说,+= 运算符创建一个新元组,然后重新绑定给变量 l2[2]。这等同于 l2[2] = l2[2] + (10, 11)。










深复制过程图示:
from copy import deepcopy
l1 = [3, [66, 55, 44], (7, 8, 9)]
l2 = deepcopy(l1)
l1.append(100)
l1[1].remove(55)
print('l1:', l1)
print('l2:', l2)
l2[1] += [33, 22]
l2[2] += (10, 11)
print('l1:', l1)
print('l2:', l2)











网友评论