Python3 淺拷貝與深拷貝

2025-04-15 10:10:33 字數 3088 閱讀 1091

1樓:帳號已登出

在python中,當進行賦值操作時,實際上是將乙個物件的應用賦給了乙個變數,因此這兩個變數指向的是同乙個物件。如果我們需要複製乙個物件,那麼就需要使用拷貝操作。

淺複製是指新建乙個物件,然後將原始物件的引用複製給新物件。由於新物件與原始物件同一記憶體位址,因纖啟此乙個物件的值被修改後,另乙個物件的值也會受到影響。淺拷貝只複製物件的一層內容。

遞迴複製原始物件及其子物件的所有內容,從而建立乙個新的物件,這就是深度複製。由於新物件與原始物件並無共享記憶體位址,故而二者完全獨立,因此更改其中乙個物件的值並不會影響另乙個物件的值。

python深淺拷貝使用場景

淺拷貝適合於物件層次結構較淺的情況,比如列表、元組、字典等簡單物件的複製。如果物件的元素全部為不可變型別,則可以使用淺拷貝來複制該物件。

如果物件層次結構比較複雜,例如巢狀列表的列表或巢狀字典的字典,那麼深拷貝就是乙個合適的選擇。如果乙個物件的元素包含可變物件,那麼在需要進行拷貝時必須使用深拷貝。

python深淺拷貝注意事項

對於不可變物件,淺拷貝和深拷貝都是相同的。

淺拷貝只會複製可變物件的一層內容,而不會遞迴複製可變物件包含的子物件。如果需要遞迴複製子物件,必須使用深拷貝。

當乙個物件包含迴圈引用時,嘗試進行深複製可能會導致無限遞迴,從而導致程式崩潰。因此,在使用深拷貝時,必須小心處理包含迴圈引用的物件。

在使用深拷貝時,如果物件的層次結構比較複數豎扒雜,可能會導致效能問題,因此必須小心使用深拷薯昌貝。

python的深拷貝和淺拷貝

2樓:新科技

1.什麼是深拷貝?什麼是淺拷貝?(深拷貝與淺拷貝的區別)

簡單點來說,就是假設b複製了a,當修改a時,看b是否會發生變化,如果b也跟著變了,說明這是淺拷貝,拿人手短,如果b沒變,那就是深拷貝,自食其力。

也可以這麼說: 淺拷貝沒有拷貝子物件,所以原始資料改變,子物件會改變;深拷貝,包含物件裡面的子物件的拷貝,所以原始物件的改變不會造成深拷貝里任何子元素的改變。

1)父物件是可變物件拷貝,只拷貝父物件的的值,不會對其子物件的值進行拷貝而是拷貝的子物件的索引,然後建立乙個新的物件(id位址不一樣),如果子物件是可變物件,依然是可以修改的。

2)父物件是不可變物件的拷貝,就悶首襲是對另外乙個變數的記憶體位址的拷貝(id位址一樣)或者螞兄說物件引用。

import copy

a1=[1,2]

a2=[3,4]

a=[a1,a2]

b=淺拷貝。

c=深拷貝。

print(id(a)) #

print(id(b)) #

print(id(c)) #

print(id(a[0]))#

print(id(b[0]))#

print(id(c[0]))#

import copy

a1=(1,2)

a2=(3,4)

a=(a1,a2)

b=c=print(id(a)) #

print(id(b)) #

print(id(c)) #

print(id(a[0]))#

print(id(b[0]))#

print(id(c[0]))#

芹段"

python深拷貝和淺拷貝的區別

3樓:背後的抽屜

淺拷貝是對乙個物件父級(外層)的拷貝,並不會拷貝子級(內部),而深拷貝對乙個物件是所有層次的拷貝(遞迴),內部和外部都會被拷貝過來。

使用淺慧咐拷貝的時候,分為兩種情況。

第一種,如果晌碧蠢最外層的資料型別是可變的,比如說列表,字典等,淺拷貝會開啟新的位址空間去存放。

第二種,如果最外層的資料型別是不可變的,比如元組,字串等,淺拷貝物件的時候,還是引用物件的位址空間。

深拷貝也分兩種情況:

第一種,最外層資料型別可變。這個宴陪時候,內部和外部的都會拷貝過來。

第二種,外層資料型別不可變,如果裡面是可變資料型別,會新開闢位址空間存放。如果內部資料型別不可變,才會如同淺拷貝一樣,是對位址的引用。

python深拷貝和淺拷貝的區別

4樓:山東中公優就業

1、淺拷貝(shallow copy)

所謂「淺拷貝」,是指建立乙個新的物件,其內容是原物件中元素的引用。(拷貝組合物件,不拷貝子物件)

常見的淺拷貝有:切片操作、工廠函式、物件的copy()方法、copy模組中的copy函式。

2、深拷貝(deep copy)

所謂「深拷貝」,是指建立乙個新的物件,然後遞迴的拷貝原物件所包含的子物件。深拷貝出來的物件與原物件沒有任何關聯。

深拷貝只有一種方式:copy模組中的deepcopy函式。

總結:

copy淺拷貝,沒有拷貝子物件,所以原始資料改變,子物件會改變。

深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝里任何子元素的改變。

python深拷貝和淺拷貝的區別

5樓:網友

假如有乙個列表 names:

將它拷貝乙份:

name2 =

接下來 將 names 裡面的 orange 改成 桔子:

names[2] = '桔子'

因為 name2 是 names 的拷貝 現在 names 的元素變了。

那 name2 的元素會不會也受到影響呢?

print(names)

print(name2)

結果發現 names 變了 但是它的拷貝並沒有跟著變:

那現在 修改子列表 name2 的元素。

看看原列表 namse 會不會受到影響:

以上描述的是淺拷貝。

外面的改了不影響原列表。

但是裡面的改變 可以影響原列表。

那麼深拷貝是怎樣的呢?

就把上面那些**裡面的 copy 換成 deepcopy就可以看到深拷貝與淺拷貝的不同點了。

詳解python2和python3的區別

1.效能 py3.0執行 pystone benchmark的速度比py2.5慢30 guido認為py3.0有極大的優化空間,在字串和整形操作上可 以取得很好的優化結果。py3.1效能比py2.5慢15 還有很大的提升空間。2.編碼 py3.x原始碼檔案預設使用utf 8編碼,這就使得以下 是合法...

python簡單的問題,python 3 一個簡單的問題

程式執行的結果是2 這是由於,計算機儲存資料的精度有限 可以看到a b是0.00999999999999801,而不是0.01 對於浮點數,判斷相等不會用 a b,而是abs a b 0.01類似的你應該使用 a b 0.01 0.01作為判斷條件 這個 應該是輸出2,不可能輸出1,你應該是在浮點數...

python3中嘗試for else迴圈語句時出現的keyerror name 錯誤

你的stu遍歷了整個列表,前面兩個字典是有 name key的,沒有問題,後面兩個 c d 當然是會報錯的。python 執行報錯nameerror出現原因,怎麼解決 python中for迴圈語句不能正常使用 sumdigits 0 for c in str 1952 sumdigits int c...