在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中的浅拷贝。
所谓深度拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。
注意: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中是浅拷贝。