欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

為什么Python中的函數(shù)會修改全局的列表和字典-創(chuàng)新互聯(lián)

Python中的函數(shù)(內(nèi)置函數(shù)和我們自己編寫的自定義函數(shù))是處理數(shù)據(jù)的關(guān)鍵工具。但是他們對我們的數(shù)據(jù)做了什么可能有點令人困惑,如果我們不知道發(fā)生了什么,它可能會在我們的分析中造成嚴(yán)重的錯誤。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、中方網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、商城網(wǎng)站制作、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為中方等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

在本教程中,我們將詳細研究Python在函數(shù)中處理不同數(shù)據(jù)類型時是如何對它們進行操作的,并學(xué)習(xí)如何確保只有在希望更改數(shù)據(jù)時才更改數(shù)據(jù)。

函數(shù)中的內(nèi)存隔離

為了理解Python如何處理函數(shù)內(nèi)部的全局變量,我們來做一個小實驗。我們將創(chuàng)建兩個全局變量number_1和number_2,并為它們賦值整數(shù)?5?和?10。然后,我們將使用這些全局變量作為函數(shù)的參數(shù)來執(zhí)行一些簡單的數(shù)學(xué)運算。我們還將使用變量名作為函數(shù)的參數(shù)名。然后,我們將查看函數(shù)中所有變量的使用是否影響了這些變量的全局值。

為什么Python中的函數(shù)會修改全局的列表和字典

正如我們在上面看到的,函數(shù)正常運行,全局變量number_1和number_2的值沒有變化,盡管我們在函數(shù)中使用它們作為形參和實參名。這是因為Python將函數(shù)中的變量存儲在與全局變量不同的內(nèi)存位置。它們是被隔離的。因此,變量number_1可以在全局中有一個值(5),而在函數(shù)內(nèi)部有一個不同的值(50),在這個函數(shù)中它是獨立的。

(順便說一句,如果你對parameters(形參) 和 arguments(實參)之間的區(qū)別感到困惑,Python文檔中關(guān)于這個主題的內(nèi)容非常有用。)

那么列表和字典呢?

列表

我們已經(jīng)看到,我們在函數(shù)內(nèi)部對上面的number_1這樣的變量所做的操作并不影響它的全局值。但是number_1是一個整數(shù),這是一個非常基本的數(shù)據(jù)類型。如果我們用不同的數(shù)據(jù)類型(比如列表)嘗試相同的實驗,會發(fā)生什么?下面,我們將創(chuàng)建一個名為duplicate_last()?的函數(shù),它將復(fù)制我們作為參數(shù)傳遞的任何列表中的最終條目。

為什么Python中的函數(shù)會修改全局的列表和字典

正如我們所看到的,這里?initial_list?的全局值被更新了,即使它的值只在函數(shù)內(nèi)部更改!

字典

現(xiàn)在,我們來編寫一個函數(shù),該函數(shù)以一個字典作為參數(shù)來查看全局字典變量在函數(shù)中被操作時是否也會被修改。

為了看起來更直觀一點,我們將使用Python基礎(chǔ)課程中使用的?AppleStore.csv?數(shù)據(jù)集中的數(shù)據(jù)(數(shù)據(jù)可以從這里下載)。

在下面的代碼片段中,我們從一個字典開始,它包含了數(shù)據(jù)集中各個年齡級別的應(yīng)用程序的數(shù)量(因此有4433個應(yīng)用程序的級別為“4+”,987個應(yīng)用程序的級別為“9+”,等等)。假設(shè)我們想計算每個年齡等級的百分比,這樣我們就可以得到在App Store中哪個年齡等級是最常見的。

為此,我們將編寫一個名為?make_percentages()?的函數(shù),該函數(shù)以一個字典作為參數(shù)并將計數(shù)轉(zhuǎn)換為百分比。我們需要從0開始計數(shù),然后遍歷字典中的每個值,將它們添加到計數(shù)中,這樣就得到了評級的總數(shù)。然后我們將再次遍歷字典,并對每個值做一些數(shù)學(xué)運算來計算百分比。

為什么Python中的函數(shù)會修改全局的列表和字典

在查看輸出之前,讓我們快速回顧一下上面發(fā)生的事情。在將我們的app 年齡評級字典分配給變量content_ratings之后,我們創(chuàng)建了一個名為make_percentages()的新函數(shù),它只接受一個參數(shù):?a_dictionary。

為了計算每個年齡等級的應(yīng)用程序所占比例,我們需要知道應(yīng)用程序的總數(shù),因此我們首先將一個名為total的新變量設(shè)置為0,然后在a_dictionary中循環(huán)遍歷每個鍵值,并將其添加到total中。

完成之后,我們需要做的就是再次遍歷a_dictionary,將每個條目除以總數(shù),然后將結(jié)果乘以100。這將給我們返回一個包含百分比的詞典。

但是,當(dāng)我們使用全局content_ratings變量作為這個新函數(shù)的參數(shù)時發(fā)生了什么呢?

為什么Python中的函數(shù)會修改全局的列表和字典

正如我們在列表中看到的,我們的全局content_ratings變量已經(jīng)更改,盡管它只是在我們創(chuàng)建的make_percentages()函數(shù)中進行了修改。

這里到底發(fā)生了什么?我們遇到了可變和不可變數(shù)據(jù)類型之間的差異。

可變和不可變的數(shù)據(jù)類型

在Python中,數(shù)據(jù)類型可以是可變的(可更改的),也可以是不可變的(不可更改的)。雖然我們在介紹Python時使用的大多數(shù)數(shù)據(jù)類型都是不可變的(包括整數(shù)、浮點數(shù)、字符串、布爾值和元組),但是列表和字典是可變的。這意味著全局列表或字典即使在函數(shù)內(nèi)部使用時也可以更改,就像我們在上面的示例中看到的那樣。

要理解可變(可更改)和不可變(不可更改)之間的區(qū)別,了解Python如何處理這些變量是很有幫助的。

讓我們從考慮一個簡單的變量賦值開始:

為什么Python中的函數(shù)會修改全局的列表和字典

變量名a的作用類似于一個指向5的指針,它可以幫助我們隨時檢索5。

5是一個整數(shù),整數(shù)是不可變的數(shù)據(jù)類型。如果數(shù)據(jù)類型是不可變的,這意味著一旦創(chuàng)建,就不能更新它。如果我們執(zhí)行a += 1,我們實際上并沒有更新5到6。在下面的動畫中,我們可以看到這一點:

a?初始指向?5.

執(zhí)行a += 1?后, 將指針從?5指向?6, 它并沒有實際改變?5.

可變數(shù)據(jù)類型(如列表和字典)的行為有所不同。它們可以更新。舉個例子,我們來創(chuàng)建一個非常簡單的列表:

為什么Python中的函數(shù)會修改全局的列表和字典

如果我們在列表末尾添加一個3,我們不是簡單地將list_1指向另一個列表,而是直接更新現(xiàn)有列表:

即使我們創(chuàng)建多個列表變量,只要它們指向同一個列表,當(dāng)列表被更改時,它們都會被更新,如下面的代碼所示:

為什么Python中的函數(shù)會修改全局的列表和字典

下面是上面代碼中實際發(fā)生的動態(tài)可視化:

這就解釋了為什么我們之前在試驗列表和字典時我們的全局變量被改變了。因為列表和字典是可變的,所以更改它們(即使是在函數(shù)中)也會更改列表或字典本身,這與不可變數(shù)據(jù)類型不同。

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

一般來說,我們不希望函數(shù)更改全局變量,即使它們包含列表或字典之類的可變數(shù)據(jù)類型。這是因為在更復(fù)雜的分析和程序中,我們可能會經(jīng)常使用許多不同的函數(shù)。如果所有函數(shù)都更改它們正在調(diào)用的列表和字典,那么要跟蹤什么在更改什么就會變得非常困難。

幸運的是,有一種簡單的方法可以繞過這個問題:我們可以使用內(nèi)建的Python方法.copy()復(fù)制列表或字典。

如果你還沒有學(xué)習(xí)過方法,請不要擔(dān)心。它們包含在我們的中級Python課程中,但是在本教程中,你只需要知道.copy()的工作原理類似于.append():

為什么Python中的函數(shù)會修改全局的列表和字典

讓我們再看一下我們?yōu)榱斜韺懙暮瘮?shù),對它進行更新,這樣函數(shù)內(nèi)部執(zhí)行的操作就不會更改initial_list。我們只需要將傳遞給函數(shù)的參數(shù)從initial_list更改為initial_list.copy()

為什么Python中的函數(shù)會修改全局的列表和字典

正如我們所看到的,這已經(jīng)解決了我們的問題。原因如下:使用.copy()創(chuàng)建一個列表的獨立副本,這樣a_list就不會指向initial_list本身,而是指向一個以initial_list副本開始的新列表。在此之后對a_list所做的任何更改都將只對該獨立列表生效,而不是initial_list本身,因此initial_list的全局值將保持不變。

不過,這個解決方案仍然不完美,因為每次向函數(shù)傳遞參數(shù)時都必須記得添加.copy(),否則可能會意外更改initial_list的全局值。如果我們不想操心這個,我們可以在函數(shù)內(nèi)部創(chuàng)建列表拷貝:

為什么Python中的函數(shù)會修改全局的列表和字典

使用這種方法,我們可以安全地將一個可變的全局變量(如initial_list)傳遞給我們的函數(shù),全局值不會被改變,因為函數(shù)本身會復(fù)制一個副本,然后對該副本執(zhí)行操作。

.copy()方法也適用于字典。與列表一樣,我們可以簡單地將.copy()添加到傳遞給函數(shù)的參數(shù)中,創(chuàng)建一個用于函數(shù)的拷貝,而不會改變原始變量:

為什么Python中的函數(shù)會修改全局的列表和字典

但是,再次說明,使用這種方法意味著在每次將字典傳遞給make_percentages()函數(shù)時,都要記得添加.copy()。如果我們要頻繁地使用這個函數(shù),最好在函數(shù)內(nèi)部實現(xiàn)復(fù)制,這樣我們就不需要記住了。

下面,我們將在函數(shù)內(nèi)部使用.copy()。這樣,就可以確保我們在將全局變量作為參數(shù)傳遞給函數(shù)時不會被更改,而且我們也不需要記得為傳遞的每個參數(shù)添加.copy()。

為什么Python中的函數(shù)會修改全局的列表和字典

正如我們所看到的,修改我們的函數(shù)來創(chuàng)建字典的副本,然后只在副本中將計數(shù)更改為百分比,這樣我們就可以在不更改content_ratings的情況下執(zhí)行我們想要的操作。

結(jié)論

在本教程中,我們研究了可變數(shù)據(jù)類型(可以更改)和不可變數(shù)據(jù)類型(不能更改)之間的區(qū)別。我們學(xué)習(xí)了如何使用.copy()方法復(fù)制列表和字典等可變數(shù)據(jù)類型,這樣我們就可以在不更改其全局值的情況下在函數(shù)中使用它們。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享標(biāo)題:為什么Python中的函數(shù)會修改全局的列表和字典-創(chuàng)新互聯(lián)
本文鏈接:http://aaarwkj.com/article42/cccohc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、App設(shè)計自適應(yīng)網(wǎng)站、定制網(wǎng)站、軟件開發(fā)服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
欧美精品在线观看不卡一区| 未满十八禁止在线观看av| 亚洲精品成人综合色在线| 午夜视频在线观看区一| 久久精品久久精品欧美大片| 亚洲国产欧美在线91| 在线激情视频一区二区| 日本一区二区在线观看视频| 日本乱码中文字幕在线观看| 成人黄色av网站在线观看| 91久久国产综合久久91| 亚洲视频在线的视频在| 福利在线视频一区二区| 日韩成人中文字幕电影| 91九色在线免费观看| 欧美日韩国产一区在线| 国产一区二区精品久久岳√| 91久久精品凹凸一区二区| 欧美一级纯黄电影视频| 日本2区3区视频在线观看| 欧美人妻不卡一区二区久久 | 蜜臀av一区二区高清| 亚洲无人区码一码二码三码| 日本黄色免费在线观看网站| 熟女人妻一区二区三区免费看| 欧美中文字幕内射合集| 亚洲成人日韩在线播放| 日韩一区二区人妻在线| 国产l精品国产亚洲区久久| 国产精品视频在线播放| 一区二区三区乱码av| 日韩精品在线免费观看了| 国产一区二区三区精品久久| 最新中文字幕成人在线观看| 蜜臀av首页在线观看| 国产精品视频一区二区噜| 亚洲av乱码一区二区三区观影| 一区二区日韩欧美国产| 岛国免费av在线观看| 日韩精品一区二区三区夜色| 日韩黄国产一区二区三|