亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的賦值、深拷貝與淺拷貝有哪些區別

發布時間:2021-02-02 14:46:39 來源:億速云 閱讀:138 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Python的賦值、深拷貝與淺拷貝有哪些區別的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

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

>>> list_demo2 = [2,3,4]

>>> c= copy.deepcopy(list_demo2)

>>> print(list_demo2)

[2, 3, 4]

>>> print(c)

[2, 3, 4]

>>> id(list_demo2)

6011440

>>> id(c)

6012440

>>> list_demo2.append(['a','b'])

>>> c.append([5,6])

>>> print(list_demo2)

[2, 3, 4, ['a', 'b']]

>>> print(c)

[2, 3, 4, [5, 6]]

>>> list_demo2[3].append('c')

>>> c[3].append(7)

>>> print(list_demo2)

[2, 3, 4, ['a', 'b', 'c']]

>>> print(c)

[2, 3, 4, [5, 6, 7]]

>>>

從上述代碼示例可以看出 list_demo2 與 c 相互獨立,無論 list_demo2 與 c本身進行了修改,或者各自的子對象進行了修改 都沒有互相影響。

總結

Python賦值

賦值的本質就是將一個對象的內存空間地址賦值給一個變量,讓變量指向該內存空間地址。

Python淺拷貝

淺拷貝是拷貝了源對象的引用,并創建了一個新的內存空間地址。但是引用的對象的子對象的地址仍然是源對象的,所以當源對象的子對象發生改變時,拷貝對象內的子對象同時也跟著改變。

Python深拷貝

深拷貝就是徹底的拷貝,完全的拷貝了父對象及子對象,同時指向一個新的內存空間地址。源對象與拷貝對象之間的修改互不影響。

感謝各位的閱讀!關于“Python的賦值、深拷貝與淺拷貝有哪些區別”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太谷县| 信阳市| 自贡市| 大新县| 临沧市| 甘孜县| 新密市| 定远县| 锡林郭勒盟| 融水| 兰考县| 乌拉特后旗| 茌平县| 平潭县| 汽车| 泾源县| 茂名市| 陕西省| 项城市| 神木县| 涡阳县| 富宁县| 娱乐| 贡山| 德清县| 枞阳县| 舞钢市| 龙泉市| 建湖县| 浠水县| 新野县| 太和县| 涞水县| 遵化市| 林周县| 波密县| 丹寨县| 九江市| 高雄市| 延川县| 应城市|