• 深入理解python中列表的深浅复制


    【1】在前面学习列表的知识中,列表的复制有个copy()方法

    aList = ["a","b","c","d"]
    #将aList复制给bList
    bList = aList.copy()
    print(aList)
    #['a', 'b', 'c', 'd']
    print(bList)
    #['a', 'b', 'c', 'd']

      假如将列表aList中的"b"元素改成"B",bList的元素是否会改变?

    aList = ["a","b","c","d"]
    #将aList复制给bList
    bList = aList.copy()
    #修改aList中的元素"b"
    aList[1] = "B"
    print(aList)
    #['a', 'B', 'c', 'd']
    print(bList)
    #['a', 'b', 'c', 'd']

      结果发现修改了列表aList的元素"b",列表bList却没有发生变化。

      下面用一个图来分析它的原理

      分析:aList指向一个列表,把aList复制了一份给bList,由于修改的是aList,所以bList不会被修改

    【2】列表嵌套的复制

    aList = ["a",["e","f","g"],"c","d"]
    #将aList复制给bList
    bList = aList.copy()
    #把aList中的"e"改为"E"
    aList[1][1]= "E"
    print(aList)
    #['a', ['e', 'E', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'E', 'g'], 'c', 'd']

      列表嵌套的复制,发现aList和bList的都被修改了。原理如下

      分析:嵌套的列表单独分配一块空间,从第一层列表中去引用地址,复制的bList 也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。

      则:copy()方法只能复制一层,这也叫做浅复制。

      注意:第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用

     【3】浅复制的三种方法

      1、使用copy模块

    import copy
    aList = ["a","b","c"]
    bList = copy.copy(aList)
    print(aList)
    #['a', 'b', 'c']
    print(bList)
    #['a', 'b', 'c']
    aList = ["a",["e","f","g"],"c","d"]
    bList = copy.copy(aList)
    #把aList中的"e"改为"E"
    aList[1][1]= "E"
    print(aList)
    #['a', ['e', 'E', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'E', 'g'], 'c', 'd']

      2、使用列表的切片方法

    aList = ["a",["e","f","g"],"c","d"]
    bList = aList[:]
    print(aList)
    #['a', ['e', 'f', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'f', 'g'], 'c', 'd']

      3、使用list()方法

    aList = ["a",["e","f","g"],"c","d"]
    bList = list(aList)
    print(aList)
    #['a', ['e', 'f', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'f', 'g'], 'c', 'd']
    aList[1][1]= "E"
    print(aList)
    #['a', ['e', 'E', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'E', 'g'], 'c', 'd']

    【4】深复制

    import copy
    aList = ["a",["e","f","g"],"c","d"]
    #深复制
    bList = copy.deepcopy(aList)
    print(aList)
    #['a', ['e', 'f', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'f', 'g'], 'c', 'd']
    aList[1][1]= "E"
    print(aList)
    #['a', ['e', 'E', 'g'], 'c', 'd']
    print(bList)
    #['a', ['e', 'f', 'g'], 'c', 'd']

  • 相关阅读:
    深入单机事务
    事务的本质
    云计算是什么?
    linux命令之tail
    linux命令之rpm
    String、StringBuffer与StringBuilder区别
    自定义今天的520
    logback中MDC使用
    数组(转载)
    spring获取webapplicationcontext,applicationcontext几种方法详解(转载)
  • 原文地址:https://www.cnblogs.com/Jiangchuanwei/p/8486499.html
Copyright © 2020-2023  润新知