日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Python赋值、浅拷贝、深拷贝

發(fā)布時間:2025/7/14 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python赋值、浅拷贝、深拷贝 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、賦值(assignment)

>>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep='\n') 139701469405552 139701469405552

  

在Python中,用一個變量給另一個變量賦值,其實就是給當(dāng)前內(nèi)存中的對象增加一個“標(biāo)簽”而已。

如上例,通過使用內(nèi)置函數(shù) id() ,可以看出 a 和 b 指向內(nèi)存中同一個對象。a is b會返回 True 。

二、淺拷貝(shallow copy)

注意:淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。

所謂“淺拷貝”,是指創(chuàng)建一個新的對象,其內(nèi)容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)

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

>>> a = [1, 2, 3] >>> b = list(a) >>> print(id(a), id(b)) # a和b身份不同 140601785066200 140601784764968 >>> for x, y in zip(a, b): # 但它們包含的子對象身份相同 ... print(id(x), id(y)) ... 140601911441984 140601911441984 140601911442016 140601911442016 140601911442048 140601911442048

  

三、深拷貝(deep copy)

所謂“深拷貝”,是指創(chuàng)建一個新的對象,然后遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關(guān)聯(lián)。

深拷貝只有一種方式:copy模塊中的deepcopy函數(shù)。

>>> import copy >>> a = [1, 2, 3] >>> b = copy.deepcopy(a) >>> print(id(a), id(b)) 140601785065840 140601785066200 >>> for x, y in zip(a, b): ... print(id(x), id(y)) ... 140601911441984 140601911441984 140601911442016 140601911442016 140601911442048 140601911442048

  

看了上面的例子,有人可能會疑惑:

為什么使用了深拷貝,a和b中元素的id還是一樣呢?

答:這是因為對于不可變對象,當(dāng)需要一個新的對象時,python可能會返回已經(jīng)存在的某個類型和值都一致的對象的引用。而且這種機制并不會影響 a 和 b 的相互獨立性,因為當(dāng)兩個元素指向同一個不可變對象時,對其中一個賦值不會影響另外一個。

我們可以用一個包含可變對象的列表來確切地展示“淺拷貝”與“深拷貝”的區(qū)別:

>>> import copy >>> a = [[1, 2],[5, 6], [8, 9]] >>> b = copy.copy(a) # 淺拷貝得到b >>> c = copy.deepcopy(a) # 深拷貝得到c >>> print(id(a), id(b)) # a 和 b 不同 139832578518984 139832578335520 >>> for x, y in zip(a, b): # a 和 b 的子對象相同 ... print(id(x), id(y)) ... 139832578622816 139832578622816 139832578622672 139832578622672 139832578623104 139832578623104 >>> print(id(a), id(c)) # a 和 c 不同 139832578518984 139832578622456 >>> for x, y in zip(a, c): # a 和 c 的子對象也不同 ... print(id(x), id(y)) ... 139832578622816 139832578621520 139832578622672 139832578518912 139832578623104 139832578623392

  

從這個例子中可以清晰地看出淺拷貝與深拷貝地區(qū)別。




總結(jié):

1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。
2、淺拷貝:創(chuàng)建一個新的組合對象,這個新對象與原對象共享內(nèi)存中的子對象。
3、深拷貝:創(chuàng)建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關(guān)聯(lián)。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。

淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對于數(shù)字、字符串以及其它“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。

轉(zhuǎn)載于:https://www.cnblogs.com/wangbaihan/p/8067822.html

總結(jié)

以上是生活随笔為你收集整理的Python赋值、浅拷贝、深拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。