• python之copy模块介绍


    1. copy.deepcopy()

    案例1:

    import copy
    
    List1 = ['1', '2', 3, 'a', ['b', 'c']]
    List2 = List1  # 将List1赋给List2
    List3 = copy.copy(List1)  # 浅拷贝
    List4 = copy.deepcopy(List1)  # 深拷贝
    
    List1.append('test')  # 在List1末尾添加'test'
    List1[4].append('d')  # 在List1中['b','c']的末尾添加'd'
    
    print('List1:%s' % List1)
    print('List2:%s' % List2)
    print('List3:%s' % List3)
    print('List4:%s' % List4)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出:

    List1:['1', '2', 3, 'a', ['b', 'c', 'd'], 'test']
    List2:['1', '2', 3, 'a', ['b', 'c', 'd'], 'test']
    List3:['1', '2', 3, 'a', ['b', 'c', 'd']]
    List4:['1', '2', 3, 'a', ['b', 'c']]
    
    • 1
    • 2
    • 3
    • 4

    总结:

    • copy.copy() 是浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。
    • copy.deepcopy() 是深拷贝,会拷贝对象及其子对象,哪怕以后对其有改动,也不会影响其第一次的拷贝。

    案例2:

    import copy
    a = [1, 2, 3]
    d = copy.deepcopy(a) # a和d的地址不相同
    a[0] = 2
    print(d)
    print(id(a), id(d))  # id() 输出a和d变量的地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    [1, 2, 3]
    2793378037960 2793379617288
    
    • 1
    • 2

    2. pandas.DataFrame.copy()

    DataFrame.copy(deep=True)

    复制此对象的索引和数据。

    • deep=True(默认)时,将使用调用对象的数据和索引的副本创建新对象。对副本的数据或索引的修改不会反映在原始对象中。
    • deep=False,将创建一个新对象而不复制调用对象的数据或索引(仅复制对数据和索引的引用)。对原始数据的任何更改都将反映在浅层副本中(反之亦然)。
    属性说明
    参数deepbool,默认为True。创建深层副本,包括数据和索引的副本。随着deep=False无论是指数还是数据复制。
    返回copySeriesDataFramePanel。对象类型与调用者匹配。

    例子:

    >>> s = pd.Series([1, 2], index=["a", "b"])
    >>> s
    a    1
    b    2
    dtype: int64
    >>> s_copy = s.copy()
    >>> s_copy
    a    1
    b    2
    dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    浅拷贝与默认(深层)拷贝:

    >>> s = pd.Series([1, 2], index=["a", "b"])
    >>> deep = s.copy()
    >>> shallow = s.copy(deep=False)
    
    • 1
    • 2
    • 3

    浅拷贝与原始数据共享数据和索引。

    >>> s is shallow
    False
    >>> s.values is shallow.values and s.index is shallow.index
    True
    
    • 1
    • 2
    • 3
    • 4

    深层副本具有自己的数据和索引副本。

    >>> s is deep
    False
    >>> s.values is deep.values or s.index is deep.index
    False
    
    • 1
    • 2
    • 3
    • 4

    浅拷贝和原始数据共享的数据的更新反映在两者中; 深拷贝保持不变。

    >>> s[0] = 3
    >>> shallow[1] = 4
    >>> s
    a    3
    b    4
    dtype: int64
    >>> shallow
    a    3
    b    4
    dtype: int64
    >>> deep
    a    1
    b    2
    dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    请注意,复制包含Python对象的对象时,深层副本将复制数据,但不会以递归方式复制。更新嵌套数据对象将反映在深层副本中。

    注意:下面的 dtype:object

    s = pd.Series([[1, 2], [3, 4]])
    deep = s.copy()
    s[0][0] = 10
    >>> s
    0    [10, 2]
    1     [3, 4]
    dtype: object
    >>> deep
    0    [10, 2]
    1     [3, 4]
    dtype: object
    >>>type(s)
    pandas.core.series.Series
    >>>type(deep)
    pandas.core.series.Series
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    对于 DataFrame

    s = pd.DataFrame([[1, 2], [3, 4]])
    deep = s.copy()
    s[0][0] = 10
    >>> s
        0  1
    0  10  2
    1   3  4
    
    >>> deep
       0  1
    0  1  2
    1  3  4
    
    >>>type(s)
    pandas.core.frame.DataFrame
    >>>type(deep)
    pandas.core.frame.DataFrame
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    C++ 构造函数
    Linux vi和vim编辑器、快捷键的使用
    Lighting - 虚幻中的进阶灯光(一)
    2023年浙大MBA项目的后备考阶段三大策略:你永远要相信光的力量
    艾美捷PD-1体内抗体说明书及相关研究
    Vulnhub系列靶机---JANGOW 1.0.1
    微信怎么开直播卖货你知道吗?
    (C++)把字符串转换成整数
    模拟实现【二叉搜索树】
    Vue2路由的详细讲解
  • 原文地址:https://blog.csdn.net/weixin_46713695/article/details/128050475