問題1 :為什么只設置了joe的值,但是jane的值也跟著變化呢?
原因:因為我們只做了一個淺拷貝,對一個對象進行淺拷貝其實是新創建了一個類型跟原對象一樣,其內容是原來對象元素的 | 引用 | 直白的說就是,新建了一個對象,但是它的內容 | 引用 | 原來的對象。
因為對象jane的內容引用自joe的內容,所以當joe的內容更改時,jane也隨之更改。
序列類型對象的淺拷貝是默認類型拷貝,可以用以下幾種方式實施
完全切片操作利用工廠函數,比如list(), dict()等使用copy模塊的copy函數問題2: 為什么對設置wifey名字時,hubby的名字沒有改變?
因為在person列表的兩個對象中,第一個是字符串,不可變,第二個是可變的列表,當進行淺拷貝時,字符串被顯式的拷貝,并新創建一個字符串對象,而列表元素,只是把它的引用復制了一下。
改變前
>>> id(x) for x in hubby>>> [4344118896, 4349387912]>>> [id(x) for x in wifey]>>> [4344118896, 4349387912] # 相同改變后
>>> id(x) for x in hubby>>> [4350395376, 4349387912]>>> id(x) for x in wifey>>> [4350586624, 4349387912] #列表第1個值的id已經不同,說明是另外創建了對象。要創建分離的對象,需要使用深拷貝
>>> person = ['name', ['saving', 100.0]] >>> hubby = person>>> import copy>>> wifey = copy.deepcopy(person)>>> [id(x) for x in person, hubby, wifey]>>> [4401609544, 4401609544, 4402474376] #可以看到,wifey的id已經不一樣了 >>> hubby[0] = 'joe'>>> wifey[0] = 'jane'>>> hubby,wifey>>> (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])>>> hubby[1][1] = 50.00>>> hubby,wifey>>> (['joe', ['saving', 50.0]], ['jane', ['saving', 100.0]]) # 此時,jane的saving不再隨著joe改變 #驗證一下id看是不是真的改變了 >>> [id(x) for x in hubby]>>> [4402580776, 4401564632]>>> [id(x) for x in wifey]>>> [4401200608, 4401248232]#四個對象都是不一樣的了關于拷貝的警告 1 非容器類型(比如數字,字符串,和其他‘原子’類型的對象沒有拷貝一說,淺拷貝是用完全切片來完成的,第二,如果元組變量,只包含原子類型對象,對它的深拷貝將不會進行,如果把person里第二個元素改成(),即使使用深拷貝也只能得到一個淺拷貝
新聞熱點
疑難解答