對Python中列表和數組的賦值,淺拷貝和深拷貝的實例講解


引用:https://www.jb51.net/article/142775.htm

列表賦值:

1
2
3
4
5
6
7
>>> a = [ 1 , 2 , 3 ]
>>> b = a
>>> print b
[ 1 , 2 , 3 ]
>>> a[ 0 ] = 0
>>> print b
[ 0 , 2 , 3 ]

解釋:[1, 2, 3]被視作一個對象,a,b均為這個對象的引用,因此,改變a[0],b也隨之改變

如果希望b不改變,可以用到切片

1
2
3
4
>>> b = a[:]
>>> a[ 0 ] = 0
>>> print b
[ 1 , 2 , 3 ]

解釋,切片a[:]會產生一個新的對象,占用一塊新的內存,b指向這個新的內存區域,因此改變a所指向的對象的值,不會影響b

列表深拷貝和淺拷貝

淺拷貝

1
2
3
4
5
6
7
8
>>> import copy
>>> a = [ 1 , 2 , 3 , [ 5 , 6 ]]
>>> b = copy.copy(a)
>>> print b
[ 1 , 2 , 3 , [ 5 , 6 ]]
>>> a[ 3 ].append( 'c' )
>>> print b
[ 1 , 2 , 3 , [ 5 , 6 , 'c' ]]

深拷貝

1
2
3
4
5
>>> a = [ 1 , 2 , 3 , [ 5 , 6 ]]
>>> b = copy.deepcopy(a)
>>> a[ 3 ].append( 'c' )
>>> print b
[ 1 , 2 , 3 , [ 5 , 6 ]]

拷貝即是開辟一塊新的內存空間,把被拷貝對象中的值復制過去。而淺拷貝並沒有為子對象[5,6]開辟一塊新的內存空間,而僅僅是實現對a中[5,6]的引用。所以改變a中[5,6]的值,b中的值也會發生變化。

深拷貝則是為子對象也開辟了一塊新空間。所以改變a中[5, 6]的值,並不影響b

數組賦值不能用切片來達到相同的目的

1
2
3
4
5
6
>>> import numpy as np
>>> a = np.array([ 1 , 2 , 3 ])
>>> b = a[:]
>>> a[ 0 ] = 5
>>> print a, b
[ 5 2 3 ] [ 5 2 3 ]

如上,雖然用切片,但不能達到修改a而不影響b的目的。說明a,b仍然指向同一塊內存。

此時,只能用拷貝

1
2
3
4
>>> b = a.copy()
>>> a[ 0 ] = 5
>>> print a, b
[ 5 2 3 ] [ 1 2 3 ]

此時修改a不會影響到b。其中的原因以后進一步深究。

注意,列表的拷貝是copy.copy(obj)或copy.deepcopy(obj),數組的拷貝是obj.copy()

以上這篇對Python中列表和數組的賦值,淺拷貝和深拷貝的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM