案例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
DataFrame.copy(deep=True)
复制此对象的索引和数据。
deep=True
(默认)时,将使用调用对象的数据和索引的副本创建新对象。对副本的数据或索引的修改不会
反映在原始对象中。deep=False
,将创建一个新对象而不复制调用对象的数据或索引(仅复制对数据和索引的引用
)。对原始数据的任何更改都将反映在浅层副本中(反之亦然)。属性 | 说明 |
---|---|
参数 | deep: bool ,默认为True 。创建深层副本,包括数据和索引的副本。随着deep=False无论是指数还是数据复制。 |
返回 | copy: Series ,DataFrame 或Panel 。对象类型与调用者匹配。 |
例子:
>>> 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