天天看點

Python可變對象、不可變對象與淺拷貝、深拷貝一,Python中的可變對象和不可變對象二,引用指向、深拷貝與淺拷貝

https://www.cnblogs.com/sun-haiyu/p/7096918.html

一,Python中的可變對象和不可變對象

不可變對象

該對象所指向的記憶體中的值不能被改變。當改變某個變量時候,由于其所指的值不能被改變,相當于把原來的值複制一份後再改變,這會開辟一個新的位址,變量再指向這個新的位址。

可變對象

該對象所指向的記憶體中的值可以被改變。變量(準确的說是引用)改變後,實際上是其所指的值直接發生改變,并沒有發生複制行為,也沒有開辟新的出位址,通俗點說就是原地改變。

Python中,

不可變類型:數值類型(int和float)、字元串str、元組tuple

可變類型:清單list、字典dict、集合set

https://www.jianshu.com/p/03dce38cc97e

二,引用指向、深拷貝與淺拷貝

引用指向

 例如:

a = [1, 2]
b = a
           

這種指派id(a) = id(b),不論可變資料類型還是不可變資料類型

淺拷貝,copy子產品裡面的copy方法實作

1、對于 不可 變類型 Number String Tuple,淺複制僅僅是位址指向,不會開辟新空間。

2、對于 可 變類型 List、Dictionary、Set,淺複制會開辟新的空間位址(僅僅是最頂層開辟了新的空間,裡層的元素位址還是一樣的),進行淺拷貝

3、淺拷貝後,改變原始對象中為可變類型的元素的值,會同時影響拷貝對象的;改變原始對象中為不可變類型的元素的值,隻有原始類型受影響。(操作拷貝對象對原始對象的也是同理)

4、list[:]、dict.copy()類似于淺拷貝操作。

深拷貝,copy子產品裡面的deepcopy方法實作

1、如果每一層都是不可變類型,深拷貝依然拷貝的是引用,不會建立新的記憶體。

2、如果有一層是可變對象,則深拷貝會拷貝每一層,建立記憶體。

總結:

1、如果變量内部的資料每一層都是不可變類型,深拷貝和淺拷貝都是位址指向

2、如果變量最外層是可變類型,淺拷貝會拷貝最外層,開辟新的空間,id改變;深拷貝會拷貝所有的可變類型,開辟新的空間,id改變。

3、如果變量資料的最外層是不可變類型,内部包含有可變資料,淺拷貝會對最外層做位址指向,id不變;深拷貝開辟新的空間,id改變,并拷貝内部所有的可變類型。