zoukankan      html  css  js  c++  java
  • Python 直接赋值、浅拷贝和深度拷贝全解析

    • 直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思)。

    • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

    • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

     

         下面是引用两个作者的内容 附上链接

    https://www.cnblogs.com/huangbiquan/archive/2017/11/06/7795152.html

     1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间。
      2.浅拷贝: 创建新对象,其内容是原对象的引用。
        浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数。
        如: lst = [1,2,3,[4,5]] 
        切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]
        工厂函数:lst1 = list(lst)
        copy函数:lst1 = copy.copy(lst)

        浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在lst中有一个嵌套的list[4,5],如果我们修改了它,情况就不一样了。

      3.深拷贝:只有一种形式,copy模块中的deepcopy函数。
         和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。
         深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。

    >>> import copy
    >>> a = [1,2,3,4,['a','b']] #定义一个列表a
    >>> b = a #赋值
    >>> c = copy.copy(a) #浅拷贝
    >>> d = copy.deepcopy(a) #深拷贝
    
    >>> a.append(5)
    >>> print(a)
    [1, 2, 3, 4, ['a', 'b'], 5] #a添加一个元素5
    >>> print(b) 
    [1, 2, 3, 4, ['a', 'b'], 5] #b跟着添加一个元素5 
    >>> print(c)
    [1, 2, 3, 4, ['a', 'b']] #c保持不变
    >>> print(d)
    [1, 2, 3, 4, ['a', 'b']] #d保持不变
    
    >>> a[4].append('c') 
    >>> print(a)
    [1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一个元素c
    >>> print(b)
    [1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟着添加一个元素c
    >>> print(c)
    [1, 2, 3, 4, ['a', 'b', 'c']] #c跟着添加一个元素c
    >>> print(d)
    [1, 2, 3, 4, ['a', 'b']] #d保持不变
    
    #说明如下:
    #1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。
    #2.无论原列表a如何变化,深拷贝d都保持不变。
    #3.赋值对象随着原列表一起变化


    Python 直接赋值、浅拷贝和深度拷贝解析

    https://www.cnblogs.com/alinh/p/6603976.html

     
    • 直接赋值:其实就是对象的引用(别名)。

    • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

    • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

    字典浅拷贝实例

    实例

    1
    2
    3
    4
    5
    6
    7
    >>>a = {1: [1,2,3]}
    >>> b = a.copy()
    >>> a, b
    ({1: [123]}, {1: [123]})
    >>> a[1].append(4)
    >>> a, b
    ({1: [1234]}, {1: [1234]})

    深度拷贝需要引入 copy 模块:

    实例

    1
    2
    3
    4
    5
    6
    7
    >>>import copy
    >>> c = copy.deepcopy(a)
    >>> a, c
    ({1: [1234]}, {1: [1234]})
    >>> a[1].append(5)
    >>> a, c
    ({1: [12345]}, {1: [1234]})

    解析

    1、b = a: 赋值引用,a 和 b 都指向同一个对象。

    2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

    3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

    更多实例

    以下实例是使用 copy 模块的 copy.copy( 浅拷贝 )和(copy.deepcopy ):

    实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/python
    # -*-coding:utf-8 -*-
      
    import copy
    = [1234, ['a''b']] #原始对象
      
    = a                       #赋值,传对象的引用
    = copy.copy(a)            #对象拷贝,浅拷贝
    = copy.deepcopy(a)        #对象拷贝,深拷贝
      
    a.append(5)                 #修改对象a
    a[4].append('c')            #修改对象a中的['a', 'b']数组对象
      
    print'a = ', a )
    print'b = ', b )
    print'c = ', c )
    print'd = ', d )

    以上实例执行输出结果为:

    1
    2
    3
    4
    ('a = ', [1234, ['a''b''c'], 5])
    ('b = ', [1234, ['a''b''c'], 5])
    ('c = ', [1234, ['a''b''c']])
    ('d = ', [1234, ['a''b']])
  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/Aljt/p/7854208.html
Copyright © 2011-2022 走看看