簡述python中的深淺拷貝
阿新 • • 發佈:2020-07-11
說到什麼是深淺拷貝,就不得不說python中賦值的含義,賦值並不是拷貝,而是將target和object建立了一種聯絡,當一個object可變時,連線該object的任意一個target改變該object值都會影響其他連線該object的target的取值。如:
>>> a=[1,2,3] >>> b=a >>> b[0]=0 >>> b [0, 2, 3] >>> a [0, 2, 3]
那如果只想改變一個mutable object的值,而它原來的值還保留,該怎麼辦呢?答案就是拷貝,通過python 內建庫copy。
而拷貝又分為深拷貝(copy.deepcopy)和淺拷貝(copy.copy),深淺拷貝的區別在於對“複合物件”(即該物件還包含了其他物件,如list,dict等)時拷貝的不同:
對於淺拷貝,新建一個“複合物件”,該物件包含的是被拷貝物件的reference;
對於深拷貝,新建一個“複合物件”,儘量的把被拷貝物件中含有的物件全都深拷貝;
如:
-------------------------shallow copy------------------- >>> a=[1,2,3] >>> c=a.copy() >>> c [0, 2, 3] >>> c[0]=4 >>> c [4, 2, 3] >>> a [0, 2, 3] >>> d=[[0,1],2,3] >>> e=d.copy() >>> e[0][0]=100 >>> e [[100, 1], 2, 3] >>> d [[100, 1], 2, 3] ----------------------deep copy-------------------------- >>> import copy >>> f=copy.deepcopy(d) >>> d [[100, 1], 2, 3] >>> f [[100, 1], 2, 3] >>> f[0][0]=5 >>> f [[5, 1], 2, 3] >>> d [[100, 1], 2, 3] >>> g=[[[1],2]] >>> h=copy.deepcopy(g) >>> h[0][0][0]=100 >>> h [[[100], 2]] >>> g [[[1], 2]]
當然,對於list,dict自身的copy方法都是shallow copy