python 64式: 第10式、深浅拷贝

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import copy

'''
关键:
1 深拷贝:拷贝了对象所有元素,包含嵌套元素。是与原来对象无关的全新对象。无关性。
2 浅拷贝: 创建新对象,但新对象中各个元素是原对象对应各个元素的引用。

3 举例如下:
a = [1,[2,3]]
c = copy.copy(a)
那么a与c虽然是两个不同对象(id(a) != id(c)),但是a与c中各个元素是相同的(例如id(a[0]) = id(c[0]) , id[a[1]]=id(c[1]))
那么就是说:
例1: a.append(5)会导致a变成[1,[2,3],5],但由于a与c的地址不同,c并不会有变化。
例 2: a[1].append(6)会导致a变成[1,[2,3,6]],同样也会使得b变成[1,[2,3,6]],因为a[1] 与 b[1]地址相同,a[1]和b[1]实际是同一个对象。

总结:
深浅拷贝都是创建新的对象。但深拷贝包含了嵌套拷贝,拷贝后的对象与原对象无关。浅拷贝中的每个元素和原对象每个元素相同,如果对元素操作,会使得浅拷贝对应元素发生变化。

参考:
[1] https://www.cnblogs.com/xueli/p/4952063.html
[2] https://www.cnblogs.com/huangbiquan/p/7795152.html
[3] https://blog.csdn.net/w494675608/article/details/82114798
'''

def useCopy():
    a = [1, [2,3]]
    b = copy.copy(a)
    c = copy.deepcopy(a)
    assert (id(a) != id(b))
    for i, value in enumerate(a):
        assert (id(a[i] == id(b[i])))
    a.append(5)
    assert b == [1, [2,3]]
    assert c == [1, [2,3]]
    a[1].append(6)
    assert b == [1, [2,3,6]]
    assert c == [1, [2,3]]


def process():
    useCopy()


if __name__ == "__main__":
    process()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/83279769