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

Python深复制与浅复制问题

作者: TTTRX | 来源:发表于2020-02-09 18:18 被阅读0次

    第一次遇到这个问题是在大学时期写编译原理大作业的时候遇到的。但是一直没有用心总结。后来在写野人和传教士,点灯问题求解的时候,也因为这个问题调试好长时间,浪费了很多时间。因此,今天总结一下,希望以后能避免这样的错误。
    先举一个例子:

    def change(aList):
        for i in range(len(aList)):
            aList[i]+=1
        print(aList)
    
    theList=[[1]]
    a=theList[0]
    change(a)
    print(theList)
    

    其输出为:

    [2]
    [[2]]

    可以看出,一旦将theList中的一个元素(该元素也是一个List)赋值给a,那么a的改变,theList也会同时随之改变,同时,theList的改变也会影响到a
    那么如何解决这个问题呢:用copy函数!
    再看一份代码:

    def change(aList):
        for i in range(len(aList)):
            aList[i]+=1
        print(aList)
    
    theList=[[1]]
    a=theList[0]
    change(a)
    print(theList)
    b=theList[0].copy()
    change(b)
    print(theList)
    

    输出是:

    [2]
    [[2]]
    [3]
    [[2]]

    可以看出,b的改变并未影响theList
    再来看一份例子:

    theList=[[1]]
    a=theList
    a[0][0]+=1
    print(theList)
    b=theList.copy()
    b[0][0]+=1
    print(theList)
    

    输出是:

    [[2]]
    [[3]]

    可见,如果list元素也是list的话,即使在最顶层copy还是会相互影响。解决办法就是:

    theList=[[1]]
    a=theList
    a[0][0]+=1
    print(theList)
    b=[]
    for item in theList:
        b.append(item.copy())
    b[0][0]+=1
    print(theList)
    

    输出:

    [[2]]
    [[2]]

    总结

    使用=直接赋值,是引用赋值,更改一个,另一个同样会变, 例子中的a,b改变两次都影响到了对方
    copy() 则顾名思义,复制一个副本,原值和新复制的变量互不影响

    另外,使用copy函数进行浅复制,必须是在list的元素不再是list的情况下才奏效(list没有嵌套)。

    参考链接

    Python3 List copy()方法

    欢迎大家关注我的微信公众号:


    公众号 支付宝红包码,你领红包我赚赏金;土豪请任意收钱码打赏

    相关文章

      网友评论

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

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