• Python-深拷贝和浅拷贝


    浅拷贝和深拷贝

    • 浅拷贝:copy.copy() 只拷贝最外层的数据,如list1 = [a, b] 其中 a = [1, 2]b = [3, 4],执行 list2 = copy.copy(list1) 时,list2 中只会拷贝了 a, b 的指向,不会在内存区域中创建一份完全一样的数据
    • 深拷贝:copy.deepcopy() 拷贝所有的数据,存入一块新的内存区域中。
    • 直接赋值: 在 Python 中称作引用,可以理解为指向

    特殊的情形:

    • copy.copy()copy.deepcopy(),即深拷贝和浅拷贝,对一个内部全部是不可变类型的数据(如元组中嵌套元组等)进行拷贝,那么他们的结果相同,都是拷贝指向;
    • 如果对一个拥有可变类型数据的元组进行拷贝,那么copy.deepcopy()就是依然是拷贝所有数据, copy.copy()拷贝的是指向。

    对于 list

    • 切片操作 是 浅拷贝 等价于 copy.copy()
    • 直接复制给另一个变量仅仅是 拷贝指向
    # 切片操作举例
    In [2]: a = [11, 22]
    
    In [3]: b = [33, 44]
    
    In [4]: c = [a, b]
    
    In [5]: d = c[:]
    
    In [6]: id(c)
    Out[6]: 140628676451464
    
    In [7]: id(d)
    Out[7]: 140628676526600
    
    In [8]: id(c[0])
    Out[8]: 140628686255112
    
    In [9]: id(d[0])
    Out[9]: 140628686255112
    

    以上可知,切片操作只拷贝了 list 的最外层,效果和 copy.copy() 一样,为浅拷贝。

    对于 numpy

    • np.copy()深拷贝
    • 直接赋值给另一个变量依然只是 拷贝指向
    # numpy深拷贝示例
    In [12]: arr = np.zeros((3,3))
    
    In [13]: arr
    Out[13]:
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    In [14]: b = arr.copy()
    
    In [17]: b[0,0] = 1 # 更改b的值
    
    In [18]: arr # arr不变,说明copy()方法是深拷贝
    Out[18]:
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    In [19]: b
    Out[19]:
    array([[ 1.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    # numpy浅拷贝示例
    In [33]: b = arr # 直接赋值给变量b
    
    In [34]: b
    Out[34]:
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
    In [35]: arr[0,0] = 1
    
    In [36]: b
    Out[36]:
    array([[ 1.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    
  • 相关阅读:
    Docker 中 MySql 启动失败,报错 Can't open and lock privilege tables: Table storage engine for 'user'
    使用命令行编译和运行Java代码
    Linux编程--进程间通信
    Linux编程--信号
    HDU 2159 完全背包
    HDU 2844 多重背包
    hdu 2602 dp 01背包
    hdu 1864 01背包
    JSON学习
    Django Cookie
  • 原文地址:https://www.cnblogs.com/monteyang/p/13091377.html
Copyright © 2020-2023  润新知