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

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

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

前言

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

對比

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

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

# 對對象本身進行修改,即“最外層”
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

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

相關文章

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

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

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

    Python使用NumPy進行矩陣計算的案例詳解

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

    Python3中使用PyMongo的方法詳解

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

    Python Tkinter模塊 GUI 可視化實例

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

    Python?ini配置文件示例詳解

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

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

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

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

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

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

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

    淺析Python中的多進程與多線程的使用

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

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

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

最新評論

濮阳市| 资阳市| 昌黎县| 银川市| 越西县| 大埔县| 石棉县| 平湖市| 潮安县| 汉寿县| 来安县| 乐亭县| 清水县| 辽中县| 武穴市| 调兵山市| 霍林郭勒市| 德江县| 绿春县| 永宁县| 河北省| 彭水| 定结县| 余姚市| 德江县| 且末县| 尼木县| 凌源市| 沙田区| 依安县| 南靖县| 新晃| 大余县| 青海省| 曲阜市| 长宁区| 乌兰察布市| 高雄市| 潞城市| 鸡东县| 海原县|