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

Python變量的賦值、淺拷貝和深拷貝詳解

 更新時間:2023年11月04日 10:04:09   作者:驚瑟  
這篇文章主要介紹了Python變量的賦值、淺拷貝和深拷貝詳解,python中為聲明一個變量有三種方法:賦值、淺拷貝、深拷貝,相信每個pythoner或多或少都知道他們之間的區(qū)別,但在某些點(diǎn)上,還是會踩坑,這篇文章記錄下所有關(guān)于這三者區(qū)別的疑問,需要的朋友可以參考下

前言

python中為聲明一個變量有三種方法:賦值、淺拷貝(shadow copy)、深拷貝(deep copy),相信每個pythoner或多或少都知道他們之間的區(qū)別,但在某些點(diǎn)上,還是會踩坑,這篇文章記錄下所有關(guān)于這三者區(qū)別的疑問。

對比

在理解以上幾個概念區(qū)別之前需要明確以下問題:

  • 賦值傳遞的是原始對象的地址
  • 函數(shù)傳遞形參也是傳遞地址,該地址指向原始對象,多進(jìn)程的task函數(shù)除外,多進(jìn)程中task函數(shù)的形參和原始對象是完全不同的兩個對象,類似深拷貝(進(jìn)程間內(nèi)存獨(dú)立)
  • 淺拷貝,除了顯式地調(diào)用copy庫,還可以使用如切片、list()、dict()等函數(shù)達(dá)到淺拷貝的效果(下面會給例子)。
  • 當(dāng)我們討論python中的拷貝時,默認(rèn)針對的是可變對象,因為對于不可變對象來講,拷貝是沒有意義的,python解釋器在啟動時就將不可變對象放在內(nèi)存池中了,它在內(nèi)存的位置在解釋器終止之前不會變。假設(shè)我們通過賦值、淺拷貝、深拷貝得到了一個新的對象,那么與原始對象相比,有以下結(jié)論:
/賦值淺拷貝深拷貝
id是否變化×??
修改對象本身是否互相影響?××
修改嵌套對象是否互相影響??×

具體例子

a = ['a', 1, [1,2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)

print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')
print(f'c is: {c} , id is: {id(c)}')
print(f'd is: wppm3vysvbp , id is: {id(d)}')

輸出:

a is: ['a', 1, [1, 2]] , id is: 140211144620672
b is: ['a', 1, [1, 2]] , id is: 140211144620672
c is: ['a', 1, [1, 2]] , id is: 140211144622016
d is: ['a', 1, [1, 2]] , id is: 140211144620992

可以看出,賦值得到的新對象id與原始對象id相同,拷貝得到的新對象id與原始對象不同。

# 對對象本身進(jìn)行修改,即“最外層”
a.append(2)

print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')
print(f'c is: {c} , id is: {id(c)}')
print(f'd is: wppm3vysvbp , id is: {id(d)}')

輸出:

a is: ['a', 1, [1, 2], 2] , id is: 140211144620672
b is: ['a', 1, [1, 2], 2] , id is: 140211144620672
c is: ['a', 1, [1, 2]] , id is: 140211144622016
d is: ['a', 1, [1, 2]] , id is: 140211144620992

可以看出,修改對象本身對拷貝對象沒有影響。 再修改嵌套對象:

# 修改嵌套對象
a[2].append(3)

print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')
print(f'c is: {c} , id is: {id(c)}')
print(f'd is: wppm3vysvbp , id is: {id(d)}')

輸出:

a is: ['a', 1, [1, 2, 3], 2] , id is: 140211144620672
b is: ['a', 1, [1, 2, 3], 2] , id is: 140211144620672
c is: ['a', 1, [1, 2, 3]] , id is: 140211144622016
d is: ['a', 1, [1, 2]] , id is: 140211144620992

可以看出,修改嵌套對象,對淺拷貝對象有影響,對深拷貝對象無影響。 再看下不可變對象1的id:

print(f'1 id in a is {id(a[1])}')
print(f'1 id in b is {id(b[1])}')
print(f'1 id in c is {id(c[1])}')
print(f'1 id in d is {id(d[1])}')

輸出:

1 id in a is 140279957373168
1 id in b is 140279957373168
1 id in c is 140279957373168
1 id in d is 140279957373168 

可以看出,所有對象的不可變對象指向了同一個位置,事實上,即便在同一個對象中相同的不可變對象也是指向同一個位置:

print(f'a is {a}')
print(f'{id(a[1])}, {id(a[2][0])}')

輸出:

a is ['a', 1, [1, 2, 3], 2]
140168057503984, 140168057503984

除了顯示地使用copy.copy()獲得一個淺拷貝對象,list()、dict()等對象工廠也可以獲得一個淺拷貝對象:

a = ['a', 1, [1,2]]
b = list(a)
print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')

a[2].append(3)
print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')

輸出:

a is: ['a', 1, [1, 2]] , id is: 139717765197952
b is: ['a', 1, [1, 2]] , id is: 139718287865280
a is: ['a', 1, [1, 2, 3]] , id is: 139717765197952
b is: ['a', 1, [1, 2, 3]] , id is: 139718287865280

可以看出,a與b的id不同,但修改嵌套對象會互相影響,所以b是a的淺拷貝對象。

切片也類似,是一個淺拷貝對象:

a = ['a', 1, [1,2]]
b = a[-1:]
print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')

a[2].append(3)
print(f'a is: {a} , id is: {id(a)}')
print(f'b is:  , id is: {id(b)}')

輸出:

a is: ['a', 1, [1, 2]] , id is: 140294636448256
b is: [[1, 2]] , id is: 140294636449408
a is: ['a', 1, [1, 2, 3]] , id is: 140294636448256
b is: [[1, 2, 3]] , id is: 140294636449408

到此這篇關(guān)于Python變量的賦值、淺拷貝和深拷貝詳解的文章就介紹到這了,更多相關(guān)Python賦值、淺拷貝和深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas 表連接的具體實現(xiàn)

    pandas 表連接的具體實現(xiàn)

    在Pandas中使用merge()函數(shù)可以實現(xiàn)類似于SQL的連接操作,包括左連接、右連接、內(nèi)連接和外連接,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Python使用NumPy進(jìn)行矩陣計算的案例詳解

    Python使用NumPy進(jìn)行矩陣計算的案例詳解

    在Python中進(jìn)行高效的矩陣計算,NumPy(Numerical Python)庫是不可或缺的工具,NumPy通過其強(qiáng)大的N維數(shù)組對象ndarray和豐富的矩陣運(yùn)算函數(shù),將傳統(tǒng)Python列表的運(yùn)算效率提升百倍以上,本文將系統(tǒng)解析如何利用NumPy完成從基礎(chǔ)到高級的矩陣計算,需要的朋友可以參考下
    2025-10-10
  • Python3中使用PyMongo的方法詳解

    Python3中使用PyMongo的方法詳解

    平常在處理數(shù)據(jù)的時候,必不可少地要使用數(shù)據(jù)庫存取數(shù)據(jù),出于一些原因,個人非常喜歡MongoDB這個數(shù)據(jù)庫。下面這篇文章主要給大家介紹了Python3中使用PyMongo的方法示例,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Python Tkinter模塊 GUI 可視化實例

    Python Tkinter模塊 GUI 可視化實例

    今天小編就為大家分享一篇Python Tkinter模塊 GUI 可視化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python?ini配置文件示例詳解

    Python?ini配置文件示例詳解

    這篇文章主要給大家介紹了關(guān)于Python?ini配置文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • OpenCV平滑處理的實現(xiàn)示例

    OpenCV平滑處理的實現(xiàn)示例

    本文主要介紹了OpenCV平滑處理的實現(xiàn)示例,Opencv中濾波方式可分為均值濾波、高斯濾波和中值濾波,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • tensorflow 只恢復(fù)部分模型參數(shù)的實例

    tensorflow 只恢復(fù)部分模型參數(shù)的實例

    今天小編就為大家分享一篇tensorflow 只恢復(fù)部分模型參數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python 如何比較字符串是否一樣

    python 如何比較字符串是否一樣

    這篇文章主要介紹了python 如何比較字符串是否一樣的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺析Python中的多進(jìn)程與多線程的使用

    淺析Python中的多進(jìn)程與多線程的使用

    這篇文章主要介紹了Python中的多進(jìn)程與多線程,線程與進(jìn)程一直是Python學(xué)習(xí)和運(yùn)用當(dāng)中的重點(diǎn)和難點(diǎn),本文采用簡單的例子進(jìn)行講解,需要的朋友可以參考下
    2015-04-04
  • python總結(jié)之閉包和裝飾器

    python總結(jié)之閉包和裝飾器

    這篇文章主要為大家介紹了python閉包和裝飾器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評論

龙泉市| 北宁市| 巍山| 安化县| 宁南县| 水城县| 斗六市| 奉贤区| 娱乐| 灵丘县| 万盛区| 彭州市| 定结县| 轮台县| 龙川县| 新田县| 普宁市| 博白县| 开封县| 都安| 德保县| 龙井市| 交城县| 仪陇县| 宿州市| 岚皋县| 望奎县| 手游| 保康县| 克拉玛依市| 阿拉善盟| 楚雄市| 巴彦淖尔市| 调兵山市| 渝中区| 鄄城县| 且末县| 乌拉特前旗| 广水市| 合江县| 萨迦县|