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

python的浅拷贝和深拷贝

作者: 好遠 | 来源:发表于2018-12-13 21:46 被阅读0次

    python中提供了copy这个模块来对变量进行浅拷贝和深拷贝。

    浅拷贝

    python 中变量有三个重要的属性,id(内存地址)类型
    浅拷贝就是创建一个新id的变量,它的值和类型和拷贝对象的相同。
    当值中存在对其他对象的引用时,原变量和新变量的值中的引用对象其实是指向同一个东西,无论修改a还是b,这个引用都同时改变。
    例如

    import copy
    a = [1, 2, 3, ['a', 'b']]
    b = copy.copy(a)
    # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
    print ("修改a:")
    a[3].append('c')
    print ("a: %s" % a)
    print ("b: %s" %b)
    print ("修改b:")
    print ("a: %s" % a)
    b[3].append('d')
    print ("a: %s" % a)
    print ("b: %s" %b)
    

    输出:

    >>> import copy
    >>> a = [1, 2, 3, ['a', 'b']]
    >>> b = copy.copy(a)      # 浅拷贝
    >>> # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
    >>> print ("修改a:")
    修改a:
    >>> a[3].append('c')
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c']]
    >>> print ("b: %s" %b)
    b: [1, 2, 3, ['a', 'b', 'c']]
    >>> print ("修改b:")
    修改b:
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c']]
    >>> b[3].append('d')
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c', 'd']]
    >>> print ("b: %s" %b)
    b: [1, 2, 3, ['a', 'b', 'c', 'd']]
    

    深拷贝

    与浅拷贝不同,深拷贝会递归查找变量的值中更深层的引用,实现深层次的拷贝,因此不用担心新变量值的改变影响到原变量的值。

    例子:

    import copy
    a = [1, 2, 3, ['a', 'b']]
    b = copy.deepcopy(a)
    # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
    print ("修改a:")
    a[3].append('c')
    print ("a: %s" % a)
    print ("b: %s" %b)
    print ("修改b:")
    print ("a: %s" % a)
    b[3].append('d')
    print ("a: %s" % a)
    print ("b: %s" %b)
    

    输出:

    >>> import copy
    >>> a = [1, 2, 3, ['a', 'b']]
    >>> b = copy.deepcopy(a)    # 深拷贝
    >>> # a和b中的['a', 'b']指向同一个对象,修改其中一个都是一样的
    >>> print ("修改a:")
    修改a:
    >>> a[3].append('c')
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c']]
    >>> print ("b: %s" %b)
    b: [1, 2, 3, ['a', 'b']]
    >>> print ("修改b:")
    修改b:
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c']]
    >>> b[3].append('d')
    >>> print ("a: %s" % a)
    a: [1, 2, 3, ['a', 'b', 'c']]
    >>> print ("b: %s" %b)
    b: [1, 2, 3, ['a', 'b', 'd']]
    

    相关文章

      网友评论

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

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