當前位置:首頁 » 編程語言 » python拷貝字典

python拷貝字典

發布時間: 2023-01-23 21:51:45

1. python對象的拷貝

Python賦值操作或函數參數傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。

Python中一切皆對象,對象就像一個塑料盒子, 裡面裝的是數據。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作。現實生活中的"陶器"會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。

對象的類型還決定了它裝著的數據是允許被修改的變數(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想像成一個透明但封閉的盒子:你可以看到裡面裝的數據,但是無法改變它。類似地,可變對象就像一個開著口的盒子,你不僅可以看到裡面的數據,還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。

對象拷貝是指在內存中創建新的對象,產生新的內存地址。

淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]

① 創建列表對象並賦值給變數a

② 導入模塊,使用.()函數淺拷貝a,並賦值給變數b

③ 修改變數a的子元素a[0] = 3,由於整數是不可變對象,所以並不是修改1變為3,而是更改a[0]指向對象3

當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, ['hello','world']]

① 淺拷貝 .() 只拷貝了頂層對象,沒有拷貝子元素對象['hello','world'],即a[2]和b[2]指向同一個列表對象

② 修改a[2][1] = 'china',則b[2][1] = 'china'

當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)

變數a與變數b指向的是同一個元組對象,沒有拷貝

當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])

變數a與變數b指向的是相同的元組對象,並且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]

深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象

當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]

變數a與變數b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]

當頂層對象是mutable可變對象,但子元素也存在mutable可變對象時,如[1, 2, ['hello','world']]

深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字元串對象一樣),修改a[2][1] = 'china'後,它重新指向了新的字元串對象(內存地址為140531581905808),不會影響到b[2][1]

當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)

變數a與變數b指向的是同一個元組對象,不存在拷貝

當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])

變數a與變數b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]

使用=是賦值,即將列表對象的引用也賦值給變數b,可以將列表對象想像成一個盒子,變數a相當於這個盒子上的標簽,執行b = a後,相當於再在這個盒子上貼上b標簽,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用於雙方。

b/c/d都是a的復制,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當於淺拷貝的效果

使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當於淺拷貝的效果

同列表類似,可以使用字典的()函數或者轉換函數dict()

變數a與變數b/c指向不同的字典,但是沒有拷貝子元素,a['jobs']和b['jobs']/c['jobs']指定同一個列表, 相當於淺拷貝的效果

同列表類似,可以使用集合的()函數或者轉換函數set()

變數a與變數b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c

2. python 函數裡面 字典復制問題

如果是我,我會在函數裡面聲明b是global的,而不是用似是而非的傳值傳指針,你這樣寫是想說b_hash傳遞的是指針,可惜python里一旦用「=」賦值就已經相當於聲明了一個新的變數,所以你的這個問題兩種解決辦法:

第一個,把你要傳指針的東西放到列表裡:

deftest(aa,bb):
bb[0]=.deep(aa)
a={1:1}
b=[{}]
test(a,b)
printb[0]

這樣保證你可以通過b這個名字找到改變後的指針。

第二個,在函數里聲明你要修改的是全局變數:

deftest(aa):
globalb
b=.deep(aa)
a={1:1}
b={}
test(a)
printb

當然,你還可以用既不是global也不是local的局部作用域,那可以說叫閉包,但有些不好懂就不說了。。。

樓上的方法思想和第一種一樣,但是沒做深層拷貝,一層for循環沒有遞歸實現了.,而不是.deep。。。

3. python復制字典為什麼有單引號

Python定義了字典。Python是一種跨平台的計算機程序設計語言,python復制字典有單引號是因為Python定義了字典。是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。最初被設計用於編寫自動化腳本,隨著版本的不斷更新和語言新功能的添加,越多被用於獨立的、大型項目的開發。

4. python字典淺復制問題

這個情況跟你設計有關系的,dict1['1']應該是一個list,然後dict2['1']是另外一個list。如果前面的list跟後面的list不是一個,或者沒有的關系的話,修改dict1['1']不會影響dict2['1']。
如果dict1['1'][0]是一個list,然後dict2['1'][0]也指向這個list的話,修改dict1['1'][0],dict2['1'][0]也會跟著變化。

5. python字典淺復制問題

淺復制只復制對象內存,dict1的內存里放了兩個引用list1和list2分別指向兩個列表對象x和y,將dict1的內存復制到dict2中,於是dict2中也有兩個引用list3和list4分別指向兩個列表對象x和y。list1和list3指向同一個列表對象x,而list2和list4指向同一個列表對象y。通過list1去修改列表對象x的內容,再通過list3去訪問,結果當然是一致變化的。

6. python dict用法

dic= {key1 : value1, key2 : value2 }

字典也被稱作關聯數組或哈希表。下面是幾種常見的字典屬性:

1、dict.clear()

clear() 用於清空字典中所有元素(鍵-值對),對一個字典執行 clear() 方法之後,該字典就會變成一個空字典。

2、dict.()

() 用於返回一個字典的淺拷貝。

3、dict.fromkeys()

fromkeys() 使用給定的多個鍵創建一個新字典,值默認都是 None,也可以傳入一個參數作為默認的值。

4、dict.get()

get() 用於返回指定鍵的值,也就是根據鍵來獲取值,在鍵不存在的情況下,返回 None,也可以指定返回值。

5、dict.items()

items() 獲取字典中的所有鍵-值對,一般情況下可以將結果轉化為列表再進行後續處理。

6、dict.keys()

keys() 返回一個字典所有的鍵。

7. Python字典創建、基本操作以及常用方法

創建一個空字典自需要一對大括弧即可,從已有的鍵-值對映射或關鍵字參數創建字典需要使用 dict 函數(類)

把一個列表轉為字典,列表的每一項都是長度為2的序列。

還可使用 關鍵字實參 (**kwargs)來調用這個函數,如下所示:

字典的基本操作與序列十分相似:

字典與序列的不同:

方法 clear 刪除所有的字典項(key-value)。

復制,得到原字典的一個新副本。

效果等同於調用 dict(d) 創建新字典。
() 執行的是 淺復制 ,若字典的值是一個可變對象,那麼復制以後,相同一個鍵將關聯到同一個對象,修改該對象,將同時修改兩個字典。

模塊中的函數deep 可執行深復制。

方法fromkeys 創建一個新字典,其中包含指定的鍵,且每個鍵對應的值都是None,或者可以提供一個i額默認值。

方法get 為訪問字典項提供了寬松的環境。通常,如果你試圖訪問字典中沒有的項,將引發錯誤,而get直接返回None,或者可設置默認返回值。

當字典中不存在指定鍵時, setdefault(k,v) 添加一個指定鍵-值對;且返回指定鍵所關聯的值。

這三個方法返回值屬於一種名為 字典視圖 的特殊類型。字典視圖可用於迭代。另外,還可確定其長度以及對其執行成員資格檢查。

這三個方法自大的特點是不可變,當你的介面試圖對其他用戶提供一個只讀字典,而不希望他們修改的時候,這三個方法是很有用的;而且當原字典發生改變時,這些方法返回的對象也會跟著改變。

方法 pop 可用於獲取與指定鍵相關聯的值,並將該鍵-值對從字典中刪除。

popitem隨機刪除一個鍵-值對,並返回一個二維的元組 (key, value) ,因為字典是無序的,所以其彈出的順序也是不確定的。
書上說,這個方法在大數據量時執行效率很高,但沒有親測。

方法update 使用一個字典中的項來更新另一個字典。

8. python字典的基本操作

python字典的基本操作如下:

查詢字典

字典裡面可以嵌套字典,嵌套列表。

9. Python3 & 淺拷貝與深拷貝

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

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

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

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

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

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

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

輸出結果:

第二種方法:使用淺拷貝

輸出結果:

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

輸出結果:

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

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

10. python深拷貝和淺拷貝的區別

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

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

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

熱點內容
好用的反編譯 發布:2025-07-20 10:32:44 瀏覽:56
9月9日復刻先祖是什麼安卓 發布:2025-07-20 10:30:27 瀏覽:604
流控資料庫 發布:2025-07-20 10:27:16 瀏覽:411
雲搶包網站源碼 發布:2025-07-20 10:25:38 瀏覽:119
安卓多開為什麼一直打不開 發布:2025-07-20 10:25:00 瀏覽:880
ios移動文件夾 發布:2025-07-20 10:24:50 瀏覽:689
數控機床編程步驟 發布:2025-07-20 10:14:22 瀏覽:97
存儲單位容量最小的是 發布:2025-07-20 10:14:11 瀏覽:769
愛情腳本短 發布:2025-07-20 09:56:44 瀏覽:681
存款機的安全密碼是什麼 發布:2025-07-20 09:53:03 瀏覽:33