美文网首页
python 浅拷贝和深拷贝

python 浅拷贝和深拷贝

作者: 白菜的白v | 来源:发表于2019-04-04 00:29 被阅读0次

    赋值语句 vs 浅拷贝

    赋值语句(数据完全共享)

    l1 = [randint(0, 100) for i in range(0, 10)]
    l2 = l1
    print(l1, l2)
    l1[0] = 100
    print(l1, l2)
    

    通过赋值,l2 和l1指向同一个引用对象,改变l1的元素,l2也会改变
    输出:

    [48, 26, 48, 64, 73, 73, 84, 8, 63, 71] [48, 26, 48, 64, 73, 73, 84, 8, 63, 71]
    [100, 26, 48, 64, 73, 73, 84, 8, 63, 71] [100, 26, 48, 64, 73, 73, 84, 8, 63, 71]
    

    浅拷贝(数据半共享):

    l1 = [randint(0, 100) for i in range(0, 10)]
    l2 = copy(l1) #浅拷贝
    print(l1, l2)
    l1[0] = 100
    print(l1, l2)
    

    通过浅拷贝,l2 和l1指向不同的引用对象,改变l1子元素,并不会改变l2的元素
    输出:

    [16, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]
    [100, 64, 82, 92, 44, 75, 37, 28, 68, 23] [16, 64, 82, 92, 44, 75, 37, 28, 68, 23]
    

    浅拷贝 VS 深拷贝

    浅拷贝:

    l3 = [0, [1, 2, 3], 4]
    l4 = copy(l3)
    
    print(l3, l4)
    l3[1] = 5
    print(l3, l4)
    

    通过浅拷贝,l3 和 l4指向不同的引用对象,改变l3最上层的子元素,并不会改变l4的元素
    输出:

    [0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
    [0, 5, 4] [0, [1, 2, 3], 4]
    

    如果l3的某个子元素是可变引用对象,浅拷贝在拷贝时,只拷贝了最上层子元素的引用对象,最上层子元素对象里的子元素却指向同一个引用对象, 改变l3子元素的子元素会使得l4也发生改变

    l3 = [0, [1, 2, 3], 4]
    l4 = copy(l3)
    
    print(l3, l4)
    l3[1][0] = 5
    print(l3, l4)
    

    输出:

    [0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
    [0, [5, 2, 3], 4] [0, [5, 2, 3], 4]
    

    深拷贝(数据完全不共享):
    深拷贝会拷贝所有元素及其子元素的引用对象

    l3 = [0, [1, 2, 3], 4]
    l4 = deepcopy(l3)
    
    print(l3, l4)
    l3[1][0]= 5
    print(l3, l4)
    

    输出:

    [0, [1, 2, 3], 4] [0, [1, 2, 3], 4]
    [0, [5, 2, 3], 4] [0, [1, 2, 3], 4]
    

    相关文章

      网友评论

          本文标题:python 浅拷贝和深拷贝

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