国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python的賦值、深拷貝與淺拷貝的區別詳解

2020-02-15 21:13:48
字體:
來源:轉載
供稿:網友

在python中,給一個對象賦值,實際上就是對象對內存空間存儲的值的引用。當我們把對象賦值給另一個變量的時候,這個變量并沒有拷貝這個對象,而只是拷貝了這個對象的引用而已。

一般情況下我們會通過三種方法來實現拷貝對象的引用。

Python直接賦值

直接賦值,默認淺拷貝傳遞對象的引用而已,原始列表改變,被賦值的變量也會做相同的改變。其實就是對‘對象'的引用

示例:

>>> list_demo = [2, 4, 6]>>> a = list_demo>>> print(a)[2, 4, 6]>>> id(list_demo)65006808>>> id(a)65006808>>> list_demo.append(8)>>> print(list_demo)[2, 4, 6, 8]>>> print(a)[2, 4, 6, 8]>>> id(list_demo)65006808>>> id(a)65006808>>>

通過 id() 函數我們可以得出,變量 list_demo 與 a 指向的都是同一個內存空間地址,當被賦值的 list_demo改變,被賦值的 a 同樣會做相同的改變。這種現象普遍存在于 Python 之中,這種賦值的方式實現了 “假裝” 拷貝,真實的情況還是兩個變量和同一個對象之間的引用關系。

Python淺拷貝

import copy 模塊的 copy.copy() 方法,該方法只拷貝父對象,沒有拷貝子對象。且淺拷貝是創建一塊新的內存空間,但是內存空間內的元素的地址均是父對象元素的地址的拷貝。所以當父對象內部的子對象發生改變時,拷貝對象的內部的子對象也會跟著改變。

示例:

>>> list_demo1 = [2, 4, 6, [8, 10]]>>> a = list_demo1>>> print(list_demo1)[2, 4, 6, [8, 10]]>>> print(a)[2, 4, 6, [8, 10]]>>>>>>>>> import copy>>> b = copy.copy(list_demo1)>>> id(list_demo1)65103472>>> id(b)6011200>>> list_demo1.append(12)>>> print(list_demo1)[2, 4, 6, [8, 10], 12]>>> list_demo1[3][8, 10]>>>>>>>>>>>> list_demo1[3].append('hello')>>> print(list_demo1)[2, 4, 6, [8, 10, 'hello'], 12]>>> print(b)[2, 4, 6, [8, 10, 'hello']]>>> list_demo1[3][8, 10, 'hello']>>> b[3][8, 10, 'hello']>>>>>>>>>>>> id(list_demo1)65103472>>> id(b)6011200>>> id(list_demo1[3])64679128>>> id(b[3])64679128>>>

從上述代碼可以看出,在執行淺拷貝的時候,淺拷貝實際上只拷貝引用,不拷貝內容。同時,淺拷貝會針對父對象的子對象進行判斷,當父對象的子對象發生改變時,拷貝對象內的子對象同時也跟著改變。

Python深拷貝

import copy 模塊的 copy.deepcopy() 方法,深拷貝與淺拷貝相反,就是徹徹底底的拷貝,完全的拷貝了父對象及子對象,同時指向一個新的內存空間地址。此時,雖然源對象與拷貝對象的內容是一樣的,但是不管針對誰進行改動,另一個是絲毫不會受到影響的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 前郭尔| 横峰县| 巴马| 砀山县| 长武县| 咸阳市| 金塔县| 绍兴县| 萝北县| 嵊泗县| 大厂| 高邑县| 沙雅县| 双牌县| 恩平市| 广昌县| 苏尼特右旗| 磐安县| 周口市| 万载县| 勐海县| 山东| 日照市| 隆子县| 金坛市| 修武县| 屏山县| 平陆县| 年辖:市辖区| 常山县| 桓仁| 湘潭县| 安丘市| 新民市| 嘉祥县| 大埔县| 上饶市| 大渡口区| 兴山县| 绥化市| 万年县|