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

Python關(guān)于實(shí)參隨形參改變而改變的問題

 更新時(shí)間:2024年11月20日 08:47:33   作者:長(zhǎng)命百歲?  
本文通過實(shí)驗(yàn)總結(jié)了Python中可變和不可變數(shù)據(jù)類型的區(qū)別,并提出了通過使用.copy()方法或deepcopy()函數(shù)來保持可變數(shù)據(jù)不變的解決方案

前言

今天在實(shí)驗(yàn)過程中,發(fā)現(xiàn)將字典作為函數(shù)的形參傳入函數(shù),在函數(shù)內(nèi)改變形參,會(huì)導(dǎo)致傳入的字典的值也發(fā)生相應(yīng)的改變。

這與c++不同,令我疑惑,遂寫此文。

簡(jiǎn)單實(shí)驗(yàn)

我們對(duì)常見的數(shù)據(jù)類型進(jìn)行實(shí)驗(yàn),檢測(cè)形參的該表是否會(huì)改變傳入的實(shí)參。

變量

def change(a):
    a = 2
    print(a)
b = 1
change(b)
print(b)
>>2
>>1

可見,變量的值并沒有隨形參的改變而改變

元組

def change(a):
    a = a[:2]
    print(a)
b = (1, 2, 3)
change(b)
print(b)
>>(1, 2)
>>(1, 2, 3)

可見,元組沒有隨形參的改變而改變

列表

def change(a):
    a.append(1)
    print(a)
b = [2, 3]
change(b)
print(b)
>>[2, 3, 1]
>>[2, 3, 1]

可見,列表隨著形參的改變而發(fā)生改變

字典

def change(a):
    a[1] = 100
    print(a)
b = {1: 1, 2: 2}
change(b)
print(b)
>>{1: 100, 2: 2}
>>{1: 100, 2: 2}

可見,字典隨著形參的改變而發(fā)生改變

原因

我們遇到了可變不可變數(shù)據(jù)類型之間的差異。在Python中,數(shù)據(jù)類型可以是可變的,也可以是不可變的。

我們通常使用的(整數(shù),浮點(diǎn)數(shù),字符串,布爾值和元組)數(shù)據(jù)類型都是不可變的,但是列表和字典是可變的。

這意味著全局列表或字典即使在函數(shù)內(nèi)部使用時(shí)也可以更改,我們通過上面的例子也能看出這個(gè)問題。

不可變數(shù)據(jù)舉例

a = 1

變量a 的作用類似于一個(gè)指向 1 的指針。

變量的數(shù)據(jù)類型是不可變的,變量一旦創(chuàng)建就不能別改變。

如果我們執(zhí)行 a = a + 1。

我們實(shí)際上不是將 1 更新到 2,而是指針從 1 指向了 2。

可變數(shù)據(jù)距離

list1 = [1, 2, 3]

如果我們?cè)诹斜淼哪┪蔡砑右粋€(gè)值,我們不是將list1指向另一個(gè)列表,而是直接更新現(xiàn)有列表。

如果我們創(chuàng)建多個(gè)列表變量,只要他們指向同一個(gè)列表,那么當(dāng)列表發(fā)生改變時(shí),這些列表變量都會(huì)發(fā)生變化。

list1 = [1, 2, 3]
list2 = list1
list1.append(4)
print(list1)
print(list2)
>>[1, 2, 3, 4]
>>[1, 2, 3, 4]

心得

從這兩個(gè)例子中,我們可以直觀感受到可變數(shù)據(jù)類型與不可變數(shù)據(jù)類型之間的區(qū)別。

我們對(duì)可變數(shù)據(jù)的操作,是直接在其本身上進(jìn)行操作的。

對(duì)不可變數(shù)據(jù)的操作,是將指針指向另一個(gè)位置,而不是更改其本身。

保持可變數(shù)據(jù)不變

我們?cè)趯懘a時(shí),經(jīng)常會(huì)編寫各種函數(shù)。我們不希望傳入函數(shù)的實(shí)參,會(huì)在函數(shù)內(nèi)部被改變。那應(yīng)該怎么辦呢?

其實(shí)很簡(jiǎn)單,使用.copy()方法復(fù)制列表或字典即可。

list1 = [1, 2, 3]
list2 = list1.copy()
list1.append(4)
print(list1)
print(list2)
>>[1, 2, 3, 4]
>>[1, 2, 3]

.copy()方法會(huì)創(chuàng)建一個(gè)新的副本,這樣list2就不會(huì)指向list1指向的列表,而是指向一個(gè)新的列表。

這樣的話,list1list2就相互獨(dú)立,互不影響了。

def change(a):
    temp = a.copy()
    temp.append(4)
    print(temp)
list1 = [1, 2, 3]
change(list1)
print(list1)
>>[1, 2, 3, 4]
>>[1, 2, 3]

可見,這樣我們就解決了形參的改變帶來的實(shí)參改變的問題。對(duì)于字典也是一樣的。

補(bǔ)充

深拷貝與淺拷貝

>>> import copy
>>> origin = [1, 2, [3, 4]]
#origin 里邊有三個(gè)元素:1, 2,[3, 4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2  # 判斷 cop1 和 cop2 的值是否相同
True
>>> cop1 is cop2  # 判斷 cop1 和 cop2 是否是同一個(gè)對(duì)象
False 
#cop1 和 cop2 看上去相同,但已不再是同一個(gè)object
>>> origin[2][0] = "hey!" 
>>> origin
[1, 2, ['hey!', 4]]
>>> cop1
[1, 2, ['hey!', 4]]
>>> cop2
[1, 2, [3, 4]]

copy對(duì)于一個(gè)復(fù)雜對(duì)象的子對(duì)象并不會(huì)完全復(fù)制。什么是復(fù)雜對(duì)象的子對(duì)象呢?

比如列表里的嵌套列表(多維列表),字典里的嵌套字典(多維字典)都是復(fù)雜對(duì)象的子對(duì)象。

對(duì)于子對(duì)象,python會(huì)將其當(dāng)做一個(gè)公共鏡像存儲(chǔ)起來,所有對(duì)它的復(fù)制都會(huì)被當(dāng)成引用(就是拿指針指向同一塊區(qū)域)。所以,其中一個(gè)引用的值發(fā)生改變時(shí),其他引用的值也會(huì)發(fā)生改變。

復(fù)制復(fù)雜對(duì)象,我們也想全盤復(fù)制(包括子對(duì)象),這時(shí)我們就可以使用deepcopy()函數(shù)進(jìn)行深拷貝

import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)  # 深拷貝

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python在信息學(xué)競(jìng)賽中的運(yùn)用及Python的基本用法(詳解)

    Python在信息學(xué)競(jìng)賽中的運(yùn)用及Python的基本用法(詳解)

    下面小編就為大家?guī)硪黄狿ython在信息學(xué)競(jìng)賽中的運(yùn)用及Python的基本用法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • python應(yīng)用之如何使用Python發(fā)送通知到微信

    python應(yīng)用之如何使用Python發(fā)送通知到微信

    現(xiàn)在通過發(fā)微信信息來做消息通知和告警已經(jīng)很普遍了,下面這篇文章主要給大家介紹了關(guān)于python應(yīng)用之如何使用Python發(fā)送通知到微信的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • pytorch中節(jié)約顯卡內(nèi)存的方法和技巧

    pytorch中節(jié)約顯卡內(nèi)存的方法和技巧

    顯存不足是很多人感到頭疼的問題,畢竟能擁有大量顯存的實(shí)驗(yàn)室還是少數(shù),而現(xiàn)在的模型已經(jīng)越跑越大,模型參數(shù)量和數(shù)據(jù)集也越來越大,所以這篇文章給大家總結(jié)了一些pytorch中節(jié)約顯卡內(nèi)存的方法和技巧,需要的朋友可以參考下
    2023-11-11
  • Python繪制圓形方法及turtle模塊詳解

    Python繪制圓形方法及turtle模塊詳解

    這篇文章主要給大家介紹了關(guān)于Python繪制圓形方法及turtle模塊詳解的相關(guān)資料,Turtle庫是Python語言中一個(gè)很流行的繪制圖像的函數(shù)庫,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Python的設(shè)計(jì)模式編程入門指南

    Python的設(shè)計(jì)模式編程入門指南

    這篇文章主要介紹了Python的設(shè)計(jì)模式編程入門指南,設(shè)計(jì)模式主要指面對(duì)某些問題時(shí)需要用到的編程思想,需要的朋友可以參考下
    2015-04-04
  • 將python文件打包exe獨(dú)立運(yùn)行程序方法詳解

    將python文件打包exe獨(dú)立運(yùn)行程序方法詳解

    這篇文章主要介紹了將python文件打包exe獨(dú)立運(yùn)行程序方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python實(shí)現(xiàn)使用request模塊下載圖片demo示例

    Python實(shí)現(xiàn)使用request模塊下載圖片demo示例

    這篇文章主要介紹了Python實(shí)現(xiàn)使用request模塊下載圖片,結(jié)合完整實(shí)例形式分析了Python基于requests模塊的流傳輸文件下載操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • Python datetime包函數(shù)簡(jiǎn)單介紹

    Python datetime包函數(shù)簡(jiǎn)單介紹

    這篇文章主要介紹了Python datetime包函數(shù)簡(jiǎn)單介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例

    pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例

    今天小編就為大家分享一篇pycharm恢復(fù)默認(rèn)設(shè)置或者是替換pycharm的解釋器實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python使用opencv換照片底色的實(shí)現(xiàn)

    python使用opencv換照片底色的實(shí)現(xiàn)

    這篇文章主要介紹了python使用opencv換照片底色的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

万源市| 徐水县| 乡城县| 象州县| 盐城市| 呼和浩特市| 台州市| 台山市| 五大连池市| 吉隆县| 大冶市| 滕州市| 乌拉特后旗| 中卫市| 丹棱县| 平舆县| 玛沁县| 三明市| 景洪市| 增城市| 区。| 金坛市| 固原市| 连云港市| 凯里市| 大城县| 井冈山市| 天峻县| 阜新市| 永安市| 吴川市| 墨脱县| 万源市| 来宾市| 长治市| 阿拉善右旗| 行唐县| 朔州市| 新源县| 大英县| 四会市|