python 中對於乙個物件的操作有引用與複製,但這兩種有乙個很大的區別就是引用物件的修改會影響被引用物件的內容,複製可以分為深複製與淺複製,淺複製的修改共享資料時也會影響被複製物件的內容。
在程式中像a=b,這樣的賦值時,就會建立乙個對b物件的新引用。對於數字和字串這樣的不可以變的物件,這種賦值實際上建立了乙個b的副本。對於可變物件(如字典和列表)引用物件的改變會改變被引用物件的內容。
>>> a=[1,2,3,4]
>>> b=a
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> b is a
true
>>> type(a) == type(b)
true
>>> b[2]
3>>> b[2]=-100
>>> b
[1, 2, -100, 4]
>>> a
[1, 2, -100, 4]
淺複製將建立乙個新的物件,但它包含的是對原始物件中包含的項的引用。
>>> a =[1,2,[3,4]]
>>> b =list(a)
>>> a
[1, 2, [3, 4]]
>>> b
[1, 2, [3, 4]]
>>> b
[1, 2, [3, 4], 100]
>>> a
[1, 2, [3, 4]]
>>> b[2][0]=-100
>>> a
[1, 2, [-100, 4]]
>>> b
[1, 2, [-100, 4], 100]
>>>
此時如果修改了共享的資料,a也會變化
深複製將建立乙個新物件,並且遞迴的複製它所包含的所有物件工作,可以使用copy.deepcopy()函式完成該工作。
>>> import copy
>>> a=[1,2,[3,4]]
>>> b=copy.deepcopy(a)
>>> a
[1, 2, [3, 4]]
>>> b
[1, 2, [3, 4]]
>>> b[2][0]=-100
>>> a
[1, 2, [3, 4]]
>>> b
[1, 2, [-100, 4]]
>>>
注意此時a沒有變化
Python中物件的引用與複製
在python進行像b a這樣的賦值時,只會建立乙個對a的新引用,使a的引用計數加1,而不會建立新的物件 a xyz import sys sys.getrefcount a 3 b a sys.getrefcount b 4 id a 88292288l id b 88292288l 這樣,當引用...
Python中物件的引用與複製
在python進行像b a這樣的賦值時,只會建立乙個對a的新引用,使a的引用計數加1,而不會建立新的物件 a xyz import sys sys.getrefcount a 3 b a sys.getrefcount b 4 id a 88292288l id b 88292288l 這樣,當引用...
python 引用與複製
a b 這樣的賦值,就會建立對b的引用,對於象數字和字串這樣的不可變的物件,這種賦值實際是建立了b的乙個副本 a hello b a id a id b b is a true a 1000 b hello 對於可變物件,比如字典和列表,a和b引用的是同乙個物件,修改其中任意乙個變數都會影響到另乙個...