当前位置 博文首页 > Python基础详解之列表复制

    Python基础详解之列表复制

    作者:linda公馆 时间:2021-07-02 18:44

    目录
    • 一、前言
    • 二、直接赋值
    • 三、用切片赋值
    • 四、copy()复制实现赋值
    • 五、deepcopy()复制实现赋值
    • 六、copy()和deepcopy()的区别
      • 6.1  copy()
      • 6.2 deepcopy()

    一、前言

    Python中列表的复制分为几种情况:

    • 直接赋值
    • 浅复制
    • 深复制

    下面通过实例分析一下这几种情况的区别。

    二、直接赋值

    a = [11, 22, 33]
    b = a
    print(id(a), id(b))
    b[0]=1
    print(a,b)

    输出结果为如下所示,发现内存地址没有发生变化,b只是a的引用,通过b更改列表的值时,a同时做修改。

    在这里插入图片描述

    三、用切片赋值

    a = [11, 22, 33]
    b = a[:]
    print(id(a), id(b))
    b[0]=1
    print(a,b)

    输出结果为如下所示,发现内存地址发生了变化,通过b更改列表的值时,对a没有任何的影响。

    在这里插入图片描述

    四、copy()复制实现赋值

    a = [11, 22, 33]
    b = copy.copy(a)
    print(id(a), id(b))
    b[0]=1
    print(a,b)

    输出结果为如下所示,

    发现内存地址发生了变化,通过b更改列表的值时,对a没有任何的影响。说明copy()复制的方式和切片的方式功能相同。

    在这里插入图片描述

    五、deepcopy()复制实现赋值

    a = [11, 22, 33]
    b = copy.deepcopy(a)
    print(id(a), id(b))
    b[0]=1
    print(a,b)

    输出结果为如下所示,发现在该实例中,deepcopy()和copy()的方式没有任何区别。

    在这里插入图片描述

    那么浅复制和深复制有什么区别呢?继续看下面的实例测试。

    六、copy()和deepcopy()的区别

    6.1  copy()

    a = [11, 22, 33, [1,2]]
    b = copy.copy(a)
    print(id(a), id(b))
    b[3][0]=11
    print(a,b)

    运行结果:

    在这里插入图片描述

    6.2 deepcopy()

    a = [11, 22, 33, [1,2]]
    b = copy.deepcopy(a)
    print(id(a), id(b))
    b[3][0]=11
    print(a,b)

    运行结果:

    在这里插入图片描述

    通过上面的测试,发现当列表a中的元素包含子列表时:

    copy()方法为浅复制,没有复制子对象,当原始数据改变,子对象会改变;而deepcopy()方法包含对象里面的子对象的复制,当原始对象改变,不会造成深复制里任何子元素的改变。

    jsjbwy