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)

输出:

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']]

总结:

  • 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]
2793378037960 2793379617288

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

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

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

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

>>> s is shallow
False
>>> s.values is shallow.values and s.index is shallow.index
True

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

>>> s is deep
False
>>> s.values is deep.values or s.index is deep.index
False

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

>>> 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

请注意,复制包含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

对于 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
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐