1. 程式人生 > >Python——賦值、深拷貝和淺拷貝

Python——賦值、深拷貝和淺拷貝

賦值

賦值演示

我們先定義一個變數a,然後指向數值為100的這個空間,然後建立的變數b和a指向了同一個空間地址。
物件之間的賦值本質就是引用的傳遞。
那麼思考一下,在針對操作可變變數資料的時候,修改了a的值之後b的變化是否會發生變化?
答案自然會是肯定的,因為賦值的本質只是引用的傳遞,只要傳遞了引用,地址就指向了同一個位置。

淺拷貝

淺拷貝演示1

首先我們先定義了一個空間給了a,然後我們有拷貝了一份一模一樣的空間給了b,此時a,b對應的就是不一樣的空間,引用不同。接下來我們修改變數a的值

淺拷貝演示2

此時,b的值沒有發生改變。這剛好就驗證了拷貝的結果是指向了不同的引用,但是這種情況下,不能看出來任何問題,接下來繼續。

淺拷貝演示3

接下來我們在定義列表a給予另一個列表c,如何去理解列表a,就是列表a中還儲存了另一個列表c的引用,我們可以發現,同樣,在更改了除列表c的其餘數值是,並不能導致copy的列表b的變化,剛好再一次的驗證了,copy之後引用的不同。

淺拷貝演示4

但是接下來的問題出現在我們對列表c數值的修改之後,圖片上操作的結果是列表a的值發生變化的同時,列表b的值也發生了變化,這要如何去解釋了呢?
先記住這一句話,淺拷貝就是對資料頂層結構的照搬照抄,什麼意思呢,b在對變數a進行拷貝的時候,是資料的我就直接找一個引用來把資料拷貝下來,但是,遇到了引用,我就拷貝引用,引用指向的地址裡面儲存的什麼資料,不管,在b的地址中同樣指向了這個引用,因此,在修改了變數c的值之後,地址中的資料變化之後,變數b同樣也會發生變化。淺拷貝的資料拷貝不徹底,資料不會完全獨立。

深拷貝

深拷貝是相對於淺拷貝來說的,深拷貝是一種完全的拷貝,資料之間是完全獨立的,深拷貝是通過deepcopy實現的。

在這裡插入圖片描述

上圖的結果輸出可以明顯的看出來,淺拷貝b和深拷貝c的區別就是,針對原始資料a的引用,淺拷貝只會拷貝引用,深拷貝會進行完全拷貝,將底層資料直接拷貝過來,完全獨立,不會隨著原始資料的變化而變化。