zoukankan      html  css  js  c++  java
  • 深入理解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']

  • 相关阅读:
    绘图QPainter-画刷
    绘图QPainter-画笔
    pyqt5-多线程QThread类
    升级时出现错误的解决办法
    打包pyinstaller
    多文档界面QMdiArea
    停靠窗口QDockWidget
    堆叠窗口QStackedWidget
    VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
    【一】ODB
  • 原文地址:https://www.cnblogs.com/Jiangchuanwei/p/8486499.html
Copyright © 2011-2022 走看看