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)

输出:

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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值