最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的賦值、淺拷貝、深拷貝介紹

 更新時(shí)間:2015年03月09日 11:56:09   投稿:junjie  
這篇文章主要介紹了Python中的賦值、淺拷貝、深拷貝介紹,Python中也分為簡(jiǎn)單賦值、淺拷貝、深拷貝這幾種“拷貝”方式,需要的朋友可以參考下

和很多語(yǔ)言一樣,Python中也分為簡(jiǎn)單賦值、淺拷貝、深拷貝這幾種“拷貝”方式。

在學(xué)習(xí)過(guò)程中,一開(kāi)始對(duì)淺拷貝理解很模糊。不過(guò)經(jīng)過(guò)一系列的實(shí)驗(yàn)后,我發(fā)現(xiàn)對(duì)這三者的概念有了進(jìn)一步的了解。

一、賦值

賦值算是這三種操作中最常見(jiàn)的了,我們通過(guò)一些例子來(lái)分析下賦值操作:

str例

復(fù)制代碼 代碼如下:

>>> a = 'hello'
>>> b = 'hello'
>>> c = a
>>> [id(x) for x in a,b,c]
[4404120000, 4404120000, 4404120000]

由以上指令中,我們可以發(fā)現(xiàn)a, b, c三者的地址是一樣的。所以以上賦值的操作就相當(dāng)于c = a = b = 'hello'。

賦值是系統(tǒng)先給一個(gè)變量或者對(duì)象(這里是'hello')分配了內(nèi)存,然后再將地址賦給a, b, c。所以它們的地址是相同的。

list例

復(fù)制代碼 代碼如下:

>>> a = ['hello']
>>> b = ['hello']
>>> c = a
>>> [id(x) for x in a,b,c]
[4403975952, 4404095096, 4403975952]

但是這種情況卻不一樣了,a和b的地址不同。為何?

因?yàn)閟tr是不可變的,所以同樣是'hello'只有一個(gè)地址,但是list是可變的,所以必須分配兩個(gè)地址。

這時(shí),我們希望探究以上兩種情況如果 修改值 會(huì)如何?

str例

復(fù)制代碼 代碼如下:

>>> a = 'world'
>>> [id(x) for x in a,b,c]
[4404120432, 4404120000, 4404120000]
>>> print a, b, c
world hello hello

這時(shí)a的地址和值變了,但是b, c地址和值都未變。因?yàn)閟tr的不可變性,a要重新賦值則需重新開(kāi)辟內(nèi)存空間,所以a的值改變,a指向的地址改變。b, c由于'hello'的不變性,不會(huì)發(fā)生改變。

list例

復(fù)制代碼 代碼如下:

>>> a[0] = 'world'
>>> [id(x) for x in a,b,c]
[4403975952, 4404095096, 4403975952]
>>> print a, b, c
['world'] ['hello'] ['world']

這時(shí)a, c的值和地址均改變,但二者仍相同,b不改變。由于list的可變性,所以修改list的值不需要另外開(kāi)辟空間,只需修改原地址的值。所以a, c均改變。

在了解了以上的不同點(diǎn)之后,我們就能很好地分析淺拷貝和深拷貝了。

我們均用list作為例子。

二、淺拷貝

復(fù)制代碼 代碼如下:

>>> a = ['hello', [123, 234]]
>>> b = a[:]
>>> [id(x) for x in a,b]
[4496003656, 4496066752]
>>> [id(x) for x in a]
[4496091584, 4495947536]
>>> [id(x) for x in b]
[4496091584, 4495947536]

Line3,4可以看出a, b地址不同,這符合list是可變的,應(yīng)開(kāi)辟不同空間。那淺拷貝就是拷貝了一個(gè)副本嗎?再看Line5 - 8,我們發(fā)現(xiàn)a, b中元素的地址是相同的。如果說(shuō)字符串'hello'地址一致還能理解,但是第二個(gè)元素是list地址仍一致。 這就說(shuō)明了淺拷貝的特點(diǎn),只是將容器內(nèi)的元素的地址復(fù)制了一份 。

接著我們嘗試修改a, b中的值:

復(fù)制代碼 代碼如下:

>>> a[0] = 'world'
>>> a[1].append(345)
>>> print 'a = ', a, '\n\r', 'b = ', b
a =  ['world', [123, 234, 345]]
b =  ['hello', [123, 234, 345]]

a中第一個(gè)元素str改變,但是b中未改變;a中第二個(gè)元素改變,b中也改變。這就符合不可變的對(duì)象修改會(huì)開(kāi)辟新的空間,可變的對(duì)象修改不會(huì)開(kāi)辟新空間。也進(jìn)一步證明了 淺拷貝僅僅是復(fù)制了容器中元素的地址 。

三、深拷貝

復(fù)制代碼 代碼如下:

>>> from copy import deepcopy
>>> a = ['hello', [123, 234]]
>>> b = deepcopy(a)
>>> [id(x) for x in a, b]
[4496066824, 4496066680]
>>> [id(x) for x in a]
[4496091584, 4496067040]
>>> [id(x) for x in b]
[4496091584, 4496371792]

深拷貝后,可以發(fā)現(xiàn)a, b地址以及a, b中元素地址均不同。這才是完全 拷貝了一個(gè)副本 。

修改a的值后:

復(fù)制代碼 代碼如下:

>>> a[0] = 'world'
>>> a[1].append(345)
>>> print 'a = ', a, '\n\r', 'b = ', b
a =  ['world', [123, 234, 345]]
b =  ['hello', [123, 234]]

從Line4,5中可以發(fā)現(xiàn)僅僅a修改了,b沒(méi)有任何修改。 因?yàn)閎是一個(gè)完全的副本,元素地址均與a不同,a修改,b不受影響 。

總結(jié):

1. 賦值是將一個(gè)對(duì)象的地址賦值給一個(gè)變量,讓變量指向該地址( 舊瓶裝舊酒 )。

2. 淺拷貝是在另一塊地址中創(chuàng)建一個(gè)新的變量或容器,但是容器內(nèi)的元素的地址均是源對(duì)象的元素的地址的拷貝。也就是說(shuō)新的容器中指向了舊的元素( 新瓶裝舊酒 )。

3. 深拷貝是在另一塊地址中創(chuàng)建一個(gè)新的變量或容器,同時(shí)容器內(nèi)的元素的地址也是新開(kāi)辟的,僅僅是值相同而已,是完全的副本。也就是說(shuō)( 新瓶裝新酒 )。

相關(guān)文章

  • python/golang 刪除鏈表中的元素

    python/golang 刪除鏈表中的元素

    這篇文章主要介紹了python/golang 如何刪除鏈表中的元素,幫助大家更好的理解和使用python/golang,感興趣的朋友可以了解下
    2020-09-09
  • Python 中的結(jié)構(gòu)模式匹配及重要性

    Python 中的結(jié)構(gòu)模式匹配及重要性

    這篇文章主要介紹了Python 中的結(jié)構(gòu)模式匹配,本篇文章介紹結(jié)構(gòu)模式匹配及其在 Python 中的重要性,它還使用不同的模式來(lái)演示如何使用 match … case 語(yǔ)句,需要的朋友可以參考下
    2023-06-06
  • Python爬蟲(chóng)實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站

    Python爬蟲(chóng)實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站

    上一篇我們已經(jīng)知道怎么簡(jiǎn)單使用selenium了,那么我們就從這篇博客來(lái)動(dòng)手爬取網(wǎng)站吧,文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python編寫(xiě)運(yùn)維進(jìn)程文件目錄操作實(shí)用腳本示例

    Python編寫(xiě)運(yùn)維進(jìn)程文件目錄操作實(shí)用腳本示例

    這篇文章主要為大家介紹了Python編寫(xiě)實(shí)用運(yùn)維進(jìn)程文件目錄的操作腳本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python將dict中的unicode打印成中文實(shí)例

    python將dict中的unicode打印成中文實(shí)例

    這篇文章主要介紹了python將dict中的unicode打印成中文實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • python程序?qū)崿F(xiàn)BTC(比特幣)挖礦的完整代碼

    python程序?qū)崿F(xiàn)BTC(比特幣)挖礦的完整代碼

    這篇文章主要介紹了python程序?qū)崿F(xiàn)BTC(比特幣)挖礦的完整代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 提升python處理速度原理及方法實(shí)例

    提升python處理速度原理及方法實(shí)例

    這篇文章主要介紹了提升python處理速度原理及方法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 如何將Yolov5的detect.py修改為可以直接調(diào)用的函數(shù)詳解

    如何將Yolov5的detect.py修改為可以直接調(diào)用的函數(shù)詳解

    YOLOv4還沒(méi)有退熱,YOLOv5已經(jīng)發(fā)布,下面這篇文章主要給大家介紹了關(guān)于如何將Yolov5的detect.py修改為可以直接調(diào)用的函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 一文了解Python3的錯(cuò)誤和異常

    一文了解Python3的錯(cuò)誤和異常

    Python 的語(yǔ)法錯(cuò)誤或者稱之為解析錯(cuò),是初學(xué)者經(jīng)常碰到的。即便 Python 程序的語(yǔ)法是正確的,在運(yùn)行它的時(shí)候,也有可能發(fā)生錯(cuò)誤。運(yùn)行期檢測(cè)到的錯(cuò)誤被稱為異常。本文就來(lái)和大家聊聊Python3的錯(cuò)誤和異常,感興趣的可以學(xué)習(xí)一下
    2022-09-09
  • Python使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化

    Python使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化

    這篇文章主要為大家詳細(xì)介紹了Python如何使用Marshmallow輕松實(shí)現(xiàn)序列化和反序列化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-03-03

最新評(píng)論

屯昌县| 宁明县| 新沂市| 洛浦县| 林西县| 瑞金市| 济宁市| 九江县| 南通市| 社会| 江津市| 沾化县| 康保县| 赫章县| 黄山市| 改则县| 聊城市| 洛扎县| 宿州市| 大英县| 鄂托克旗| 镇安县| 广宁县| 奈曼旗| 濮阳县| 通海县| 鄂伦春自治旗| 高淳县| 新丰县| 金昌市| 双城市| 炎陵县| 江川县| 永年县| 新巴尔虎右旗| 名山县| 新源县| 高安市| 且末县| 科尔| 乌鲁木齐市|