zoukankan      html  css  js  c++  java
  • python赋值,深拷贝和浅拷贝的区别

    1.赋值

    list1=[[1,2],'fei',66]
    list2=list1
    list1
    [[1, 2], 'fei', 66]
    list2
    [[1, 2], 'fei', 66]
    list2.append(77)
    list2
    [[1, 2], 'fei', 66, 77]
    list1
    [[1, 2], 'fei', 66, 77]
    id(list1),id(list2)
    (72624608, 72624608)

    总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加

    2.浅拷贝

    使用的方法:copy.copy()

    代码示例:

    >>> import copy
    >>> list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> print(id(list1))
    55713024
    >>> print(id(list2))
    55712864
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55712184 
     55712184
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的
    
    >>>list1=[[1,2],'fei',66]
    >>> list2=copy.copy(list1)
    >>> list1
    [[1, 2], 'fei', 66]
    >>> list2
    [[1, 2], 'fei', 66]
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list2
    [[11, 2], 'fei', 66]
    
    #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)

    最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝

    3.深拷贝

    使用的方法:copy.deepcopy()

    代码示例:

    >>> list1=[[1,2],'fei',66]
    >>> list3=copy.deepcopy(list1)
    >>> print(id(list1),'
    ',id(list2))
    62055888 
     55713624
    >>> print(id(list1[0]),'
    ',id(list2[0]))
    55726368 
     55713704
    >>> print(id(list1[1]),'
    ',id(list2[1]))
    61987040 
     61987040
    >>> print(id(list1[2]),'
    ',id(list2[2]))
    2057136240 
     2057136240
    
    #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样
    
    >>> list1[0][0]=11
    >>> list1
    [[11, 2], 'fei', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> list1[1]='change'
    >>> list1
    [[11, 2], 'change', 66]
    >>> list3
    [[1, 2], 'fei', 66]
    >>> id(list1[1])
    62058944
    >>> id(list3[1])
    61987040
    
    #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化

    最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)

  • 相关阅读:
    Solution to LeetCode Problem Set
    《Cracking the Coding Interview》读书笔记
    诗词收集——用于人文素养扫盲
    2015年清华大学计算机系考研总结
    编程知识大杂烩
    hihoCoder 1175:拓扑排序二
    Hackerrank
    Hackerrank
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/pipile/p/12837261.html
Copyright © 2011-2022 走看看