談談Python中物件複製
你想複製一個物件?因為在Python中,無論你把物件做為引數傳遞,做為函式返回值,都是引用傳遞的。
何謂引用傳遞,我們來看一個C++交換兩個數的函式:
void swap(int &a,int &b) { int temp; temp= a; a= b; b= temp; }
這個例子就是一個引用傳遞的例子!目的是說明一下概念:引用傳遞的意思就是說你傳遞的是物件的引用,對這個引用的修改也會導致原有物件的改變。學過C/C++的朋友們都知道,在交換2個數的時候,如果自己實現一個swap函式,需要傳遞其引用或者指標。
Python直接使用引用傳遞,多方便啊,你還要吐槽什麼?你又想過我不想改變原物件的情況嗎?如果有,那麼看這裡!
假設我現在有一個list,叫做l1,我現在需要一份l1的複製,如果我直接使用諸如l2 = l1的方式,然後我對l2進行一系列的修改,會等價於我對l1直接做修改,這可不是我想要的!如:
l1= [1,2] l2= l1 l2.append(3) print l1 print l2 # l1 = [1, 2, 3], l2 = [1, 2, 3]
這就是Python引用傳遞造成的,也就是說l1和l2屬於同一list物件,那麼如何才能得到一份不同的物件呢?這不是so easy嘛,用切片撒,比如:
l1= [1,2] l2= l1[:] l2.append(3) # l1 = [1, 2], l2 = [1, 2, 3]
是的,目的達到了,別介,你確定這樣一定行?讓我們看看一個更復雜的情況:
l1 = [[1, 2], 3] l2 = l1[:] l2.append(4) # l1 = [[1, 2], 3], l2 = [[1, 2], 3, 4] l2[0].append(5) # l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4]
啊哈,貌似出問題了哈,這個可不是我們需要的!怎麼辦呢?好了,進入今天的正題,Python中的copy模組!
import copy
如果你希望複製一個容器物件,以及它裡面的所有元素(包含元素的子元素),使用copy.deepcopy,這個方法會消耗一些時間和空間,不過,如果你需要完全複製,這是唯一的方法。上面我們提到的切片的方式,等價於copy模組中的copy函式。
上面複製的操作變得so easy了:
l1= [[1,2],3] l2= copy.copy(l1) l3= copy.deepcopy(l1) l2.append(4) l2[0].append(5) l3[0].append(6) # l1 = [[1, 2, 5], 3], l2 = [[1, 2, 5], 3, 4], l3 = [[1, 2, 6], 3]
相關說明:
copy(x) Shallow copy operation on arbitrary Python objects. See the module's __doc__ string for more info. deepcopy(x, memo=None, _nil=[]) Deep copy operation on arbitrary Python objects. See the module's __doc__ string for more info.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2837004/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談JS中物件的淺複製和深複製JS物件
- 談談Python中物件拷貝Python物件
- 詳談Javascript中的深複製和淺複製JavaScript
- 談談JavaScript中建立物件(Object)JavaScript物件Object
- 淺談C#中的資料型別轉換與物件複製C#資料型別物件
- 詳談Redis主從複製原理Redis
- 談一談Python中的裝飾器Python
- C#中的物件深複製和淺複製C#物件
- 淺談:redis的主從複製 + 哨兵模式Redis模式
- 談談JavaScript 的Navigator 物件JavaScript物件
- 談談java的類與物件Java物件
- 談談軟體開發中的調研物件與被調研物件 (轉)物件
- 談談軟體開發中的調研物件與被調研物件(轉)物件
- Java中物件的深複製和淺複製詳解Java物件
- 複製物件物件
- 談談 JAVA 的物件序列化Java物件
- JS物件複製:深複製和淺複製JS物件
- VUE js中複製物件 JSONVue物件JSON
- 談談Spring中的物件跟Bean,你知道Spring怎麼建立物件的嗎?Spring物件Bean
- 談談Objective-C的物件拷貝Object物件
- 談談“物件導向”與“程式導向”物件
- vue複製物件Vue物件
- 談談我對物件導向以及類與物件的理解物件
- Python常見面試題008. 談談python中的解包Python面試題
- 細談 Linux 中的多路複用epollLinux
- 談談 react 中的 keyReact
- .net中物件序列化技術淺談物件
- 淺談python中的xpath用法Python
- 【Python】淺談python中的jsonPythonJSON
- 談談Python的生成器Python
- js物件深複製JS物件
- JavaScript物件複製理解JavaScript物件
- iOS之物件複製iOS物件
- js深度複製物件JS物件
- 談談對中斷的理解
- 談談jQuery中Ajax那些事jQuery
- 談談JavaScript中的this機制JavaScript
- 談談Android中的MVPAndroidMVP