在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用
一般有三種方法:直接賦值法,copy淺拷貝法,deepcopy深拷貝法
alist=[
1
,
2
,
3
,[
"a"
,
"b"
]]
(1)直接賦值,預設淺拷貝傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變
示意圖:alist=[1,2,3,["a","b"]]
b=alist
print(alist)#[1,2,3,["a","b"],5]
print(b)#[1,2,3,["a","b"],5]
(2)copy淺拷貝,沒有拷貝子物件,所以原始資料改變,子物件會改變
import copy
alist=[1,2,3,["a","b"]]
c=copy.copy(alist)
print(alist)#[1, 2, 3, ['a', 'b'], 5]變了
print(c)#[1, 2, 3, ['a', 'b']]沒變
print(alist)#[1, 2, 3, ['a', 'b', 'c'], 5]
print(c)#[1, 2, 3, ['a', 'b', 'c']]變了
(3)深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變
import copy
alist=[1,2,3,["a","b"]]
c=copy.deepcopy(alist)
print(alist)#[1, 2, 3, ['a', 'b'], 5]
print(c)#[1, 2, 3, ['a', 'b']]#沒變
print(alist)#[1, 2, 3, ['a', 'b', 'c'], 5]
print(c)#[1, 2, 3, ['a', 'b']]#沒變
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 這樣,當引用...
物件複製與淺複製
a 15 echo a.輸出15 b a echo b.輸出15 b 25 echo b.輸出25 echo a.輸出15 可以發現,普通變數是值傳遞,在不同的記憶體空間,其中乙個改變對於另乙個沒有影響 class student public function setage age public ...