浅拷贝 or 深拷贝

2020年5月10日 / 12次阅读 / Last Modified 2020年5月10日

浅拷贝和深拷贝是python中的经典话题,这个话题背后,其实是python的变量只是对变量对象的引用这样的实现事实。

python中一切都是对象,变量只是对象的引用!python内置的list, set, dict对象,其成员不仅仅是普通数据对象,还可以是嵌套的list,set和dict。这就造成了在copy的时候,存在浅拷贝和深拷贝两种情况的区别。

浅拷贝

浅拷贝就是在copy的时候,只是将对象内的元素的引用做复制,但是不关心元素本身内嵌的元素。由于只复制元素的引用,复制之后,就存在多个位置可以修改元素内嵌元素内容的可能性。list, set和dict对象自带的copy函数,都是浅拷贝。

>>> a = [1,2,3]
>>> b = [a,a]
>>> b
[[1, 2, 3], [1, 2, 3]]
>>> c = b.copy()
>>> c
[[1, 2, 3], [1, 2, 3]]
>>> c[0][0] = 999
>>> c
[[999, 2, 3], [999, 2, 3]]
>>> b
[[999, 2, 3], [999, 2, 3]]

说明一下这段代码:b的元素是两个a,这两个a指向相同的list对象,c是b的浅拷贝,修改c内部的嵌套元素后,b的内容也发生了变化。

下面是用dict对象举例:

>>> a = {1:1, 2:2, 3:3}
>>> a
{1: 1, 2: 2, 3: 3}
>>> b = {'a':a, 'b':a}
>>> b
{'a': {1: 1, 2: 2, 3: 3}, 'b': {1: 1, 2: 2, 3: 3}}
>>> c = b.copy()
>>> c['a'][1] = 999
>>> c
{'a': {1: 999, 2: 2, 3: 3}, 'b': {1: 999, 2: 2, 3: 3}}
>>> b
{'a': {1: 999, 2: 2, 3: 3}, 'b': {1: 999, 2: 2, 3: 3}}

同样的情况,c是b的浅拷贝,修改c,b也跟着受影响。

深拷贝

深拷贝就是要从里到外copy出一个完整的地址不同的对象出来,这样每一个对象都是独立的,可以独立修改而相互不影响。

>>> a = [1,2,3]
>>> b = [a,a]
>>> import copy
>>> c = copy.deepcopy(b)
>>> c[0][0] = 999
>>> c
[[999, 2, 3], [999, 2, 3]]
>>> b
[[1, 2, 3], [1, 2, 3]]

深拷贝要用到copy模块。

-- EOF --

本文链接:https://www.pynote.net/archives/1900

相关文章

    留言区

    《浅拷贝 or 深拷贝》有1条留言

    电子邮件地址不会被公开。 必填项已用*标注

    • 麦新杰

      C++在C的基础上扩展出object的概念后,当对象有member是pointer的时候,也有shallow copy和deep copy这样的概念,不过狂复杂,有个相关的概念,叫big-five。 [回复]


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top