美文网首页
Python 浅复制与深复制

Python 浅复制与深复制

作者: awker | 来源:发表于2019-08-06 02:26 被阅读0次

《流畅的 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)

相关文章

网友评论

      本文标题:Python 浅复制与深复制

      本文链接:https://www.haomeiwen.com/subject/fbsbdctx.html