zoukankan      html  css  js  c++  java
  • python 深复制和浅复制

    https://www.python-course.eu/python3_deep_copy.php
    -----------------------------------------------------------------------
    summarry:
    >>> colours1 = ["red", "blue"]
    >>> colours2 = colours1            
    >>> print(colours1)
    ['red', 'blue']
    >>> print(colours2)
    ['red', 'blue']
    >>> print(id(colours1),id(colours2))
    43444416 43444416
    # colours2是colours1的浅复制,即只复制了引用指针,所以他们的内存地址是一样的,简单地说colours2只是colours1的别名

    >>> colours1 = ["red", "blue"]
    >>> colours2 = ["rouge", "vert"]
    >>> print(colours1)
    ['red', 'blue']
    >>> print(colours2)
    ['rouge', 'vert']
    >>> print(id(colours1),id(colours2))
    43444416 43444200
    # 这里的colours2已经不是colours1的浅复制了,colours2获得了内存分配的地址,是一个与colours1无关的新变量。

    >>> colours2[1] = "green"
    >>> print(id(colours1),id(colours2))
    14603760 14603760
    >>> print(colours1)
    ['red', 'green']
    >>> print(colours2)
    ['red', 'green']
    # colours2改变了第二个元素值,即改变了colours1的第二个值,这是浅复制的结果

    >>> colours1 = ["red", "blue"]
    >>> colours2 = colours1[:]
    >>> colours2[1] = "orange"
    >>> colours1
    ["red", "blue"]
    >>> colours2
    ["red", "orange"]
    # 但如果我们使用切片复制的话就不会受到浅复制的影响,前提是复制的对象是不含子列表的。

    >>> lst1 = ['a','b',['ab','ba']]
    >>> lst2 = lst1[:]
    >>> lst2[0] = 'c'
    >>> print(lst1)
    ['a', 'b', ['ab', 'ba']]
    >>> print(lst2)
    ['c', 'b', ['ab', 'ba']]
    >>>
    >>> lst2[2][1] = 'd'
    >>> print(lst1)
    ['a', 'b', ['ab', 'd']]
    >>> print(lst2)
    ['c', 'b', ['ab', 'd']]
    # 如果复制的对象包含子列表的话也会受到浅复制的影响。因为lst1和lst2第3个元素指针是指向同一个list对象,即['ab', 'ba']

    >>> from copy import deepcopy
    >>>
    >>> lst1 = ['a','b',['ab','ba']]
    >>>
    >>> lst2 = deepcopy(lst1)
    >>>
    >>> lst1
    ['a', 'b', ['ab', 'ba']]
    >>> lst2
    ['a', 'b', ['ab', 'ba']]
    >>> id(lst1)
    139716507600200
    >>> id(lst2)
    139716507600904
    >>>
    >>> lst2[2][1] = "d"
    >>> lst2[0] = "c"
    >>> print(lst1)
    ['a', 'b', ['ab', 'ba']]
    >>> print(lst2)
    ['c', 'b', ['ab', 'd']]
    # 所以要深复制可以用from copy import deepcopy

    ---------------------------------------------------------------------------------------
    以下本人的验证的一个例子,感觉说的不对或不顺的自己验证一下,我不保证都对。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    import copy
    dict1 = {'user': 'vickey', 'num': [1, 2, 3],'age':{'a':'1','b':'2'}}
    dict2 = dict1 # 对原始数据的任何操作都会影响该复制
    # 先进行数据的浅复制和深复制操作
    dict3 = dict1.copy() # 浅复制: 一级为引用对象,二级为拷贝;原始数据的二级目录改变了,浅复制的数据的二级目录也会改变,但一级目录不变
    dict4 = copy.deepcopy(dict1) # 深复制:深拷贝父对象(一级目录),子对象(二级目录)是引用,非拷贝;简单地说就是与最原始的的数据时完全一致的
    # 修改 data 数据
    dict1['user'] = 'root'
    dict1['num'].remove(3)
    dict1['num'].append(6)
    dict1['age']['a'] = '111'
    # 对数据操作后再复制,则深复制和浅复制无差别了,都是更改后的数据
    # dict3 = dict1.copy()
    # dict4 = copy.deepcopy(dict1)
    # 输出结果
    print(dict1)
    print(dict2)
    print(dict3)
    print(dict4)


    打印结果

    {'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
    {'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
    {'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'vickey'}
    {'age': {'a': '1', 'b': '2'}, 'num': [1, 2, 3], 'user': 'vickey'}

  • 相关阅读:
    the error about “no such file or directory”
    Unable to Distribute in Xcode5?
    第一次连接数据库mongodb踩的坑
    在Mac下安装mongodb
    sudo brew install mongodb报错
    nodemon 热更新
    npm install 之前做的事
    JS事件委托应用场景
    解决CDN传统方法引入Iview icon 不显示问题
    React 入门
  • 原文地址:https://www.cnblogs.com/vickey-wu/p/6828489.html
Copyright © 2011-2022 走看看