Python中一切都是对象,变量中存放的是对象的引用。
引用(赋值)只是复制了原对象的引用,不会开辟新的内存空间。
引用方式:
- = 赋值符号
浅拷贝(shallow copy)是指原对象的引用拷贝。创建了新对象,其内容为原对象的引用。
浅拷贝方式
- list[:]切片操作
- dict().copy() 字典的copy方法
- list(L) 内置函数
- copy.copy() copy模块函数
深拷贝(deep copy)拷贝原对象中所有元素,包括多层嵌套。得到的新对象是一个全新对象,与原对象无任何联系。
深拷贝方式
- copy.deepcopy() copy模块函数
引用、浅拷贝、深拷贝区别:
- 引用完全复制原对象,对引用得到的新对象的改变会对原对象产生相同的改变。
- 浅拷贝只拷贝了一层对象,即只拷贝父对象,不会拷贝原对象内部的子对象。浅拷贝不随原对象最外层对象变化而变化。
- 深拷贝拷贝了所有元素,即拷贝了原对象及其子对象。不随原对象发生任何变化。
对于简单的原对象而言深/浅拷贝没区别,而原对象当中嵌套子对象,则浅拷贝只会拷贝最外层,深拷贝会全部拷贝。
例子:
>>> import pandas as pd
>>> import copy
# example 1
>>> a = pd.DataFrame([1,1])
>>> b=a
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a
0
0 1
1 1
>>> c
0
0 1
1 1
>>> a.loc[1]=2
a :0 |b :0 |c :0 |d :0
0 1 |0 1 |0 1 |0 1
1 2 |1 2 |1 1 |1 1
>>> b[1]=2
b :0 1 |a :0 1
0 1 2 |0 1 2
1 2 2 |1 2 2
c :0 |d :0
0 1 |0 1
1 1 |1 1
>>> c[2]=2
c :0 2
0 1 2
1 1 2
d :0
0 1
1 1
a :0 1
0 1 2
1 2 2
# example 2
>>> a = [1,2,3,[5,6]]
>>> a=b
>>> c=copy.copy(a)
>>> d=copy.deepcopy(a)
>>> a[2][1]='a'
a : [1, 2, [3, 'a']]
b : [1, 2, [3, 'a']]
c : [1, 2, [3, 'a']]
d : [1, 2, [3, 4]]
>>> a.append(6)
a : [1, 2, [3, 'b'], 6]
b : [1, 2, [3, 'b'], 6]
c : [1, 2, [3, 'b']]
d : [1, 2, [3, 4]]