a=b 這樣的賦值,就會建立對b的引用,對於象數字和字串這樣的不可變的物件,這種賦值實際是建立了b的乙個副本
>>> a='hello'
>>> b=a
>>> id(a)
>>> id(b)
>>> b is a
true
>>> a=1000
>>> b
'hello'
對於可變物件,比如字典和列表,a和b引用的是同乙個物件,修改其中任意乙個變數都會影響到另乙個。
>>> a=[1,2,3,4]
>>> b=a
>>> id(a)
>>> id(b)
>>> b[3]='ccccccccc'
>>> a
[1, 2, 3, 'ccccccccc']
列表和字典這樣的容器物件,可以使用兩種賦值操作:淺複製和深複製。淺複製建立乙個新物件,但它包含的是對原始
物件中包含的項的引用。
比如下面的淺複製:
>>> a=[1,2,3,4,[9,0]]
>>> b=a
>>> a=[1,2,3,4,[9,0]]
>>> b=list(a)
>>> b is a
false
>>> b[0]=1000
>>> b
[1000, 2, 3, 4, [9, 0]] #注意,b修改了b[0]以後,對a沒有影響
>>> a
[1, 2, 3, 4, [9, 0]]
>>> b[4][1]='cccc' #注意,b修改了 b[4][1]以後,對a有影響
>>> b
[1000, 2, 3, 4, [9, 'cccc']]
>>> a
[1, 2, 3, 4, [9, 'cccc']]
深複製將建立乙個新物件,並且遞迴的複製它包含的所有物件,沒有內建物件可以建立深複製,可以使用copy.deepcopy()函式完成。
>>> import copy
>>> a=[1,2,3,[4,5]]
>>> b=copy.deepcopy(a)
>>> id(b)
29582240
>>> id(a)
>>> a is b
false
>>> b[0]=1000
>>> b
[1000, 2, 3, [4, 5]] #注意修改了b[0]之後對a沒有影響
>>> a
[1, 2, 3, [4, 5]]
>>> b[3][1]='gggg'
>>> b
[1000, 2, 3, [4, 'gggg']] #修改了 b[3][1]之後對a也沒有影響,這是和淺複製的區別
>>> a
[1, 2, 3, [4, 5]]
Python 中的引用與複製
python 中對於乙個物件的操作有引用與複製,但這兩種有乙個很大的區別就是引用物件的修改會影響被引用物件的內容,複製可以分為深複製與淺複製,淺複製的修改共享資料時也會影響被複製物件的內容。在程式中像a b,這樣的賦值時,就會建立乙個對b物件的新引用。對於數字和字串這樣的不可以變的物件,這種賦值實際...
Python 列表切片陷阱 引用 複製與深複製
python 列表的切片和賦值操作很基礎,之前也遇到過一些坑,以為自己很懂了。但今天刷 codewars 時發現了乙個更大的坑,故在此記錄。python 列表賦值 複製 值 還是 引用 很多入門 python 的人會犯這樣乙個錯誤 在賦值操作 中搞不清是賦了 值 還是 引用 比如 a 1 2,3 b...
python引用和複製
在程式進行像 a b 這樣的賦值時,就會建立乙個對b的新引用。對於像數字和字串這種的不可變物件。這種賦值實際上是建立了b的副本。然而,對於可變物件 如列表和字典 引用行為會完全不同 例項 對應的輸出已經在相應的行標註 usr bin python coding utf 8 a 1,2,3,4 b a...