Python中的浅拷贝与深拷贝

简介

        在Python中,对于list而言,有赋值、浅拷贝、深拷贝;对于numpy而言,有赋值、视图、深拷贝;对于pandas而言 有赋值、视图、浅拷贝。

赋值

        所有类型都一样。

        所谓赋值就是简单的让mTest1 = mTest0,本质上就是对于mTest0指向的对象多了一个mTest1指向它,两者完全是一个东西,在不对两者重赋值(也就是改变指向)的情况下,对任何一个的任何改变,都是对另一个的改变。

视图

  所谓视图,就是为了方便你看而创建的。视图里的数据都是原对象中的数据,所以对视图里数据的任何改变(可变对象、不可变对象的改变)都会反应到原数据中去,但是改变其展示形式是不会改变原对象的形式的(如np中的reshape())。

  注意:只有numpy和pandas有视图这一说法,list中没有。

Numpy中

视图创建方式

对于mNumpy0 = np.array([[1,2],[2,3],[3,3]])

1:mNumpy1 = np.asarray(mNumpy0)

2:mNumpy1 = mNumpy0[0:]

3:mNumpy1 = mNumpy0.view()

4:mNumpy1 = mNumpy0.reshape(2,3)

Pandas中

df是一个DataFrame类型的变量

1:df1 = pd.DataFrame(df)

2:df2 = df.copy(deep=false)

3:df3 = df.iloc[:,:]

注意:1中的df是DataFrame类型时,这里才是视图,如果是字典类型的,则是浅拷贝了。

浅拷贝

浅拷贝,是指重新分配一块内存,创建一个新的对象,里面的元素是原对象中子对象的引用。注意:是新对象里面的元素是原对象中子对象的引用。

注意:只对list和pandas而言。Numpy没有浅拷贝。

List中

List中除了使用copy.deepcopy(mList1)复制外,其余的都是浅拷贝。如对mList0=[[1,2],[2,3]]:

1:mList2 = list(mList0)

2:mList2 = mList0[0:]

3:mList3 = mList0.copy()

Pands中

1:df1 = df.copy(deep=True)

2: df2 = copy.deepcopy(df)

3: df3 = copy.copy(df)

特别:

4:df4 = pd.DataFrame(mData_dict)中的mData_dict是字典时,df4中的数据是mData_dict中的浅拷贝。

Python中的浅拷贝与深拷贝_第1张图片

 

深度拷贝

所谓深度拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。

注意:DataFrame中我暂时未找到复制得到一个新的DataFrame的方法。但是对于其内数据全是不可变对象时,浅拷贝就已经够用了。(如知道的,望大神告知)

List中

Import copy

mList0 = [[1,2],[2,3]]

1:mList1 = copy.deepcopy(mList0)

Numpy中

对于:mNumpy0 = np.array([[1,2],[2,3]])

1:mNumpy1 = np.array(mNumpy0)

2:mNumpy1 = np.copy(mNumpy0)

3:mNumpy1 = mNumpy0.copy()

注意:numpy中的copy()是深拷贝,而list中是浅拷贝。

你可能感兴趣的:(python,pandas,开发语言,numpy)