美文网首页
Python学习之copy and deepcopy

Python学习之copy and deepcopy

作者: brave_wu | 来源:发表于2018-06-09 19:06 被阅读0次

    赋值操作

    我们先来看两个内容相同的对象:

    lst3 = list(range(4))
    lst4 = list(range(4))
    print('两个对象的哈希')
    print(hash(id(lst3)))
    print(hash(id(lst4)))
    print('他们是否=')
    print(lst3==lst4)
    print('他们是否is')
    print(lst3 is lst4)
    

    结果是:

    两个对象的哈希
    4377943688
    4377942472
    他们是否=
    True
    他们是否is
    False
    

    然后我们使用赋值操作:

    lst1 = lst3
    print('1 是否is 3')
    print(lst1 is lst3)
    print('两个对象的哈希')
    print(hash(id(lst1)))
    print(hash(id(lst3)))
    print('修改1后')
    lst1[2] = 99
    print('1和3的内容:')
    print(lst1)
    print(lst3)
    print('1 是否is 3')
    print(lst1 is lst3)
    

    结果:

    1 是否is 3
    True
    两个对象的哈希
    4377943688
    4377943688
    修改1后
    1和3的内容:
    [0, 1, 99, 3]
    [0, 1, 99, 3]
    1 是否is 3
    True
    

    结果表明只有哈希值相同的对象才是is

    浅拷贝

    我们把上面打印操作封装成一个函数isequel,比较一下浅拷贝对象前后:

    lst3 = [1,[10,20],3]
    print('浅拷贝')
    lst4 = lst3.copy()
    isequel(lst3,lst4)
    print('修改3的元素后')
    lst3[1][1] = 200
    print('lst3=')
    print(lst4)
    print('lst4=')
    print(lst4)
    isequel(lst3,lst4)
    

    结果:

    浅拷贝
    两个对象的哈希
    4382428360
    4382428104
    他们是否=
    True
    他们是否is
    False
    修改3的元素后
    lst3=
    [1, [10, 200], 3]
    lst4=
    [1, [10, 200], 3]
    两个对象的哈希
    4382428360
    4382428104
    他们是否=
    True
    他们是否is
    False
    

    浅拷贝后两个对象不是is的,当修改子元素中的元素后,跟随改变,说明只是复制了地址而已

    深拷贝

    需要引入copy库

    print('深拷贝 import copy')
    lst4 = copy.deepcopy(lst3)
    isequel(lst3,lst4)
    print('修改3的元素后')
    lst3[1][1] = 300
    print('lst3=')
    print(lst3)
    print('lst4=')
    print(lst4)
    isequel(lst3,lst4)
    

    结果

    深拷贝 import copy
    两个对象的哈希
    4515200136
    4510722440
    他们是否=
    True
    他们是否is
    False
    修改3的元素后
    lst3=
    [1, [10, 300], 3]
    lst4=
    [1, [10, 200], 3]
    两个对象的哈希
    4515200136
    4510722440
    他们是否=
    False
    他们是否is
    False
    

    深拷贝其实是拷贝了对象的整个结构并另外创建一个新的,所以你改变对我没有影响.

    =是深拷贝还是浅拷贝

    print('=操作:')
    lst5 = lst4
    isequel(lst4,lst5)
    lst4[1][1] = 400
    print('lst4=')
    print(lst4)
    print('lst5=')
    print(lst5)
    isequel(lst5,lst4)
    

    结果

    =操作:
    两个对象的哈希
    4390140616
    4390140616
    他们是否=
    True
    他们是否is
    True
    lst4=
    [1, [10, 400], 3]
    lst5=
    [1, [10, 400], 3]
    两个对象的哈希
    4390140616
    4390140616
    他们是否=
    True
    他们是否is
    True
    

    结果证明''=''是浅拷贝.

    相关文章

      网友评论

          本文标题:Python学习之copy and deepcopy

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