賦值 在python中一個變量可以說是內(nèi)存中一個對象的‘標(biāo)簽’或者‘引用’,。假設(shè)現(xiàn)在有一個變量a。
a是指向了內(nèi)存中的一個int型對象,,a相當(dāng)于一個指向該對象的標(biāo)簽,,如果給a重新賦值:a=7 那么a將會移動,指向另一個int型對象,。原來的對象a當(dāng)沒有任何標(biāo)簽或者引用指向它時,,會被自動釋放。 所以在python中,,變量不用定義類型,,也可以說是沒有類型,類型是屬于對象的而不是變量的,,這就和java,、c、c++等語言有很大的不同,,在這些語言中要先聲明變量類型,,并且指定類型的變量只能放入該類型的內(nèi)容。 因此,在python中,,對對象的賦值都是對象的引用地址的傳遞(變量傳遞是傳引用而不是傳值),。
a和b都指向同一個內(nèi)存地址,反過來說該內(nèi)存地址有兩個標(biāo)簽,,修改其中一個的變量的值將會引起另一個變量值的變化,。 淺拷貝與深拷貝 先從概念上來區(qū)分淺拷貝與深拷貝。 淺拷貝與上文的賦值相似,,只是換了一個標(biāo)簽(引用)(指向同一個內(nèi)存地址),而不會重新開辟一個內(nèi)存地址來存放相同的值,,改變其中一個對象的值會引起另一個對象的值的變化,。 深拷貝則是換一個標(biāo)簽(引用)并重新開辟一塊內(nèi)存來存放相同的值,因此內(nèi)存地址也會改變,,改變其中一個對象的值不會對另一個對象的值產(chǎn)生影響,。 注意:在python中,淺拷貝與深拷貝的不同僅僅是對組合對象而言,,所謂的組合對象就是指包含其他對象的對象,,比如列表、類等,。而對于數(shù)字,,字符串以及其他‘原子’類型,沒有拷貝一說,,產(chǎn)生的都是原對象的引用。
下面通過組合對象來看看深拷貝與淺拷貝的區(qū)別
淺拷貝會創(chuàng)造一個新的對象,上述例子中“a is not b”,。但是對于對象中的元素,則使用元素的引用,,也就是“a[i] is b[i]”,。
由于該對象中的第一個元素和第二個元素都是不可變類型,,當(dāng)修改不可變類型時會產(chǎn)生新的對象并使用一個新的內(nèi)存地址,而b仍然指向未修改前的地址,,所以會返回False,。第三個元素是可變類型,,修改操作不會產(chǎn)生新的對象,,所以a的變化會引起b的變化,。 常見的淺拷貝操作:切片操作,、工廠函數(shù)(如list/dir/set)、copy函數(shù),。
跟淺拷貝類似會創(chuàng)造一個新的對象,所以a is not b,。但是對于其中的元素,,深拷貝都會生成一份相同的,并使用不同的內(nèi)存地址儲存,,所以a[0] is not b[0],。 主 編 | 張禎悅 責(zé) 編 | 馬原濤 where2go 團(tuán)隊 |
|