當前位置:首頁 » 編程語言 » python的深拷貝

python的深拷貝

發布時間: 2023-08-06 08:56:51

python的賦值與復制

對於Python的初學者,在對象的使用過程中,由於對變數的賦值和對象的復制中的概念模糊,導致程序出錯。

例如,下面的代碼:

輸出結果為:

a = [6,2,3,4,5],
b = [6,2,3,4,5],
c = [1,2,3,4,5]
a等於b?True
a等於c?True
a是b?True
a是c? False

可以看到,a,b, c所指向的對象的值都相同(a==b為True). a和b都是代表同一個對象(a is b為True)。當我們通過變數b對該列表進行修改時,由於a也指向該列表,所以當列印a,b時,我們得到相同的值。 而a和c則是代表不同的對象(a is c為False),所以修改b所指向得列表不會改變c梭子鄉的列表的值.

在Python中,所有的變數都代表了對象,即便是簡單的數字類型(int, float, bool),也是以對象的形式存在的。我們看下面的代碼:

輸出結果是:

a==b為True
a is b為True

可見,a, b都是指向同一個對象。接下來,進行下面的操作,

輸出結果是:

a = 1, b = 2
a is b為False

與前面的列表不同,當我們對b做修改時,實際上是給b賦予了一個新生成的對象,對數值類型來說,所有的數值運算都會創建一個數值對象,並將這個對象指定給變數。因此,a與b指向了不同的對象,數值也不同。

再回過頭來看列表對象,

我們知道,b是與a指向同一對象的變數,使用b對該對象進行修改,與使用a對該對象進行修改,效果是完全一樣的。如果我們需要需要一個與a完全相同又與a相互獨立的列表,那麼就需要復制這個對象,也就是新建一個內容和源對象相同的對象。

對於列表來說,最簡單的復制方法是通過下標索引的方式創建新的列表:

對於各種數據類型通用的對象拷貝復制,我們可以使用python內建的模塊。

對於復雜對象(如嵌套列表)的復制,則需要注意區分淺拷貝和深拷貝。我們來看下面的代碼:

得到的結果是:
a[0] is b[0]為 True
a[0] is c[0]為 False
a = [[-1, 2, 3], [4, 5, 6]]
b = [[-1, 2, 3], [7, 8, 9]]
c = [[1, 2, 3], [4, 5, 6]]
a[1] is b[1]為False

從上面的代碼我們可以看到,函數為淺拷貝,只拷貝了對象的外層,而對象內部所包含的對象仍然指向原有的對象。而deep則為深拷貝,對象內部的對象也進行了復制。

以上我們對變數的賦值和對象的復製做了更加深入的分析。在具體的使用中,我們需要根據具體來決定使用賦值、淺拷貝、深拷貝。

⑵ Python中的賦值,淺拷貝和深拷貝的區別

賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變數都會影響到另一個。
淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,模塊的()函數}
深拷貝:創建一個新的對象,並且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){模塊的deep.deep()函數}

⑶ python關於.deep()的問題

Python中的對象之間賦值時是按引用傳遞的,如果需要拷貝對象,需要使用標准庫中的模塊。
1.
.
淺拷貝
只拷貝父對象,不會拷貝對象的內部的子對象。
2.
.deep
深拷貝
拷貝對象及其子對象
一個很好的例子:
import

a
=
[1,
2,
3,
4,
['a',
'b']]
#原始對象
b
=
a
#賦值,傳對象的引用
c
=
.(a)
#對象拷貝,淺拷貝
d
=
.deep(a)
#對象拷貝,深拷貝
a.append(5)
#修改對象a
a[4].append('c')
#修改對象a中的['a',
'b']數組對象
print
'a
=
',
a
print
'b
=
',
b
print
'c
=
',
c
print
'd
=
',
d
輸出結果:
a
=
[1,
2,
3,
4,
['a',
'b',
'c'],
5]
b
=
[1,
2,
3,
4,
['a',
'b',
'c'],
5]
c
=
[1,
2,
3,
4,
['a',
'b',
'c']]
d
=
[1,
2,
3,
4,
['a',
'b']]

⑷ python深拷貝和淺拷貝的區別

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

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

第一種,如果最外層的數據類型是可變的,比如說列表,字典等,淺拷貝會開啟新的地址空間去存放。

⑸ python深拷貝和淺拷貝的區別

1、淺拷貝(shallow )

所謂「淺拷貝」,是指創建一個新的對象,其內容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)

常見的淺拷貝有:切片操作、工廠函數、對象的()方法、模塊中的函數。

2、深拷貝(deep )

所謂「深拷貝」,是指創建一個新的對象,然後遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關聯。

深拷貝只有一種方式:模塊中的deep函數。

總結:

淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變

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

⑹ Python的復制,深拷貝和淺拷貝的區別

簡單點說
1. . 淺拷貝 只拷貝父對象,不會拷貝對象的內部的子對象。
2. .deep 深拷貝 拷貝對象及其子對象
用一個簡單的例子說明如下:
>>>import
>>>a = [1, 2, 3, 4, ['a', 'b', 'c']]
>>> b = a
>>> c = .(a)
>>> d = .deep(a)
很容易理解:a是一個列表,表內元素a[4]也是一個列表(也就是一個內部子對象);b是對a列表的又一個引用,所以a、b是完全相同的,可以通過id(a)==id(b)證明。
第4行是淺拷貝,第五行是深拷貝,通過id(c)和id(d)可以發現他們不相同,且與id(a)都不相同:
>>> id(a)
19276104
>>> id(b)
19276104
>>> id(c)
19113304
>>> id(d)
19286976
至於如何看深/淺拷貝的區別,可以通過下面的操作來展現:
>>> a.append(5) #操作1
>>> a[4].append('hello') #操作2
這時再查看結果:
>>> a
[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]
>>> b
[1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5]
>>> c
[1, 2, 3, 4, ['a', 'b', 'c', 'hello']]
>>> d
[1, 2, 3, 4, ['a', 'b', 'c']]
可以發現a、b受了操作1、2的影響,c只受操作2影響,d不受影響。a、b結果相同很好理解。由於c是a的淺拷貝,只拷貝了父對象,因此a的子對象( ['a', 'b', 'c', 'hello'])改變時會影響到c;d是深拷貝,完全不受a的影響

⑺ python的復制,深拷貝和淺拷貝的區別

在Python中存在深拷貝與淺拷貝的區別,相信有些Python初學者可能就有些疑惑,是指什麼意思呢?
1. 賦值其實只是傳遞對象引用,引用對象id是一樣的。
2. 淺拷貝是指拷貝的只是原始對象元素的引用,換句話說,淺拷貝產生的對象本身是新的,但是它的內容不是新的,只是對原對象的一個引用。
3. 深拷貝是指完全拷貝原始對象,而且產生的對象是新的,並且不受其他引用對象的操作影響。

⑻ Python3 & 淺拷貝與深拷貝

在Python中對象的賦值(=)其實就是對象的引用。即:當創建一個對象,把它賦值給另一個變數時,python並沒有拷貝這個對象,只是拷貝了這個對象的引用而已。

Python中對象的拷貝分為:淺拷貝()和深拷貝(deep)。
淺拷貝:拷貝了最外圍的對象本身,內部的元素都只是拷貝了一個引用而已。也就是,將原對象在內存中引用地址拷貝過來,然後讓新的對象指向這個地址。可以使用「=」或列表自帶的()函數(如list.()),或使用模塊的()函數。

深拷貝:外圍和內部元素都進行了拷貝對象本身,而不是引用。即把對象復制一遍,並且該對象中引用的其他對象也同時復制,完全得到一個新的一模一樣的對象,對新對象里的值進行修改不會影響原有對象,新對象和原對象完全分離開。深拷貝只能使用模塊中deep()函數,使用前要導入:from import deep。

Python中對象分為不可變對象 、可變對象。
不可變對象:一旦創建就不可修改的對象,例如:字元串、元組、數字
可變對象:可以修改的對象,例如:列表、字典。
其中Python中的切片可以應用於:列表、元組、字元串,但不能應用於字典。
而深淺拷貝,可應用於序列(列表、元組、字元串),也可應用於字典。
其中不可變對象,不管是深拷貝還是淺拷貝,地址值在拷貝後的值都是一樣的。

以下以元組(不可變類型)為例

從上述示例可以看出:
不可變對象類型,沒有被拷貝的說法,即便是用深拷貝,查看id的話也是一樣的,如果對其重新賦值,也只是新創建一個對象,替換掉舊的而已。
所以不可變類型,不管是深拷貝還是淺拷貝,地址值和拷貝後的值都是一樣的。

以下以列表(可變類型)為例
第一種方法:使用=號淺拷貝

輸出結果:

第二種方法:使用淺拷貝

輸出結果:

第三種方法:使用deep深拷貝

輸出結果:

從上述示例可以看出:
=淺拷貝:值相等,地址相等
淺拷貝:值相等,地址不相等
deep深拷貝:值相等,地址不相等

總結:
1,深淺拷貝都是對源對象的復制,佔用不同的內存空間。
2,不可變類型的對象,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變類型的對象,使用=淺拷貝時, 值相等,地址相等,對新對象里的值進行修改同時會影響原有對象;使用淺拷貝時值相等,地址不相等;使用deep深拷貝時值相等,地址不相等。可以看出針對可變類型淺拷貝和deep深拷貝,對新對象里的值進行修改不會影響原有對象。

熱點內容
怎麼翻錄加密視頻 發布:2025-02-06 21:58:12 瀏覽:549
逃離塔科夫啟動器選什麼伺服器 發布:2025-02-06 21:44:48 瀏覽:291
我的世界手機版伺服器開服教程 發布:2025-02-06 21:43:01 瀏覽:271
微信娛樂源碼 發布:2025-02-06 21:34:53 瀏覽:529
編譯翻譯運行 發布:2025-02-06 21:05:20 瀏覽:200
安卓源碼版本 發布:2025-02-06 20:51:34 瀏覽:432
安卓系統網路播放器哪個好 發布:2025-02-06 20:42:02 瀏覽:818
頭條緩存的視頻格式 發布:2025-02-06 20:32:18 瀏覽:116
ftp不顯示文件夾 發布:2025-02-06 20:30:37 瀏覽:127
蘋果手機解壓怎麼打開 發布:2025-02-06 20:29:35 瀏覽:476