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']])
  • 相关阅读:
    Laravel框架中的event事件操作
    PHP魔术方法实例
    PHP 面向对象
    ThinkPHP中where()使用方法详解
    PHP常见错误提示含义解释
    php面向对象编程self和static的区别
    php文件路径获取文件名
    php三种无限分类
    php高精度计算问题
    转:JavaScript定时机制、以及浏览器渲染机制 浅谈
  • 原文地址:https://www.cnblogs.com/Aljt/p/7854208.html
Copyright © 2011-2022 走看看