字典的區別和相互轉?
python的函數(內置函數和我們自己編寫的自定義函數)是處理數據的關鍵工具。但是他們對數據的處理可能會有些混亂,如果我們不知道發生了什么,可能會導致分析中的嚴重錯誤。
在python函數控制列表和詞典中,我們將仔細研究Python在函數內部進行操作時如何對待不同的數據類型,并學習如何確保僅在需要更改數據時才更改數據。
功能中的內存隔離
要了解Python如何處理函數內部的全局變量,讓我們做一些實驗。我們將創建兩個全局變量number_1和number_2,并將它們分配給整數5and 10。然后,我們將這些全局變量用作執行一些簡單數學運算的函數中的參數。我們還將變量名用作函數的參數名。然后,我們將查看函數內部的所有變量用法是否已影響這些變量的全局值。
正如我們可以看到上面的功能工作正常,以及全球變量的值number_1,并number_2沒有不改變,即使我們用它們作為參數,并在我們的函數的參數名稱。這是因為Python將函數的變量存儲在與全局變量不同的內存位置中。它們是孤立的。因此,變量number_1在全局范圍內可以具有一個值(5),而在函數內部則可以具有不同的值(50),在此將其隔離。
列表和詞典呢?
清單
我們已經看到,對number_1函數內部的上述變量執行的操作不會影響其全局值。但是number_1是一個整數,這是一個非常基本的數據類型。如果我們嘗試使用不同的數據類型(例如列表)進行相同的實驗,會發生什么?在下面,我們將創建一個名為的函數duplicate_last(),該函數將在我們將其作為參數傳遞的任何列表中復制最終條目。
如我們所見,即使僅在函數中更改了全局值,此處的全局值也initial_list 已更新!
辭典
現在,讓我們編寫一個將字典作為參數的函數,以查看在函數內部對全局字典變量進行修改時是否也會對其進行修改。
為了使這一點更加現實,我們將使用Python基礎知識課程中AppleStore.csv使用的數據集中的數據(可在此處下載數據)。
在下面的代碼段中,我們從一個字典開始,該字典包含數據集中每個年齡等級的應用程序數量的計數(因此,有4,433個應用程序的等級為“ 4 +”,987個應用程序的等級為“ 9+”,等等。) 。假設我們要為每個年齡等級計算一個百分比,這樣我們就可以了解到哪個年齡等級在App Store中最常見。
為此,我們將編寫一個名為的函數make_percentages(),該函數將字典作為參數并將計數轉換為百分比。我們需要從零開始計數,然后對字典中的每個值進行迭代,然后將它們添加到計數中,以便獲得評分的總數。然后,我們將再次遍歷字典,并對每個值進行一些數學運算以計算百分比。
在查看輸出之前,讓我們快速回顧一下上面發生的事情。在將應用程序年齡分級的字典分配給變量后content_ratings,我們創建了一個名為的新函數make_percentages(),該函數帶有一個參數:a_dictionary。
為了圖什么應用程序的比例下降到每一個年齡分級,我們需要知道應用程序的總數,所以我們先設置一個所謂的新的變量total,以0通過在每個鍵,然后循環a_dictionary,將它添加到total。
一旦完成,我們要做的就是a_dictionary再次循環遍歷,將每個條目除以總數,然后將結果乘以100。這將為我們提供帶有百分比的字典。
但是,當我們使用global content_ratings作為該新函數的參數時會發生什么呢?
就像我們在列表中看到的一樣content_ratings,即使僅在make_percentages()我們創建的函數內部對其進行了修改,我們的全局變量也已更改。
那么,這里到底發生了什么?我們碰到了可變和不可變數據類型之間的差異。
可變和不可變數據類型
在Python中,數據類型可以是可變的(可變的)或不可變的(不變的)。盡管我們在Python入門中使用的大多數數據類型都是不可變的(包括整數,浮點數,字符串,布爾值和元組),但列表和字典卻是可變的。這意味著全局列表或字典即使在函數內部使用時也可以更改,就像我們在上面的示例中看到的那樣。
要了解可變(可變)和不可變(不變)之間的區別,研究一下Python如何實際處理這些變量是有幫助的。
讓我們開始考慮一個簡單的變量賦值:
變量名的a作用類似于指向的指針5,它可以幫助我們5在需要時進行檢索。
5是整數,整數是不可變的數據類型。如果數據類型是不可變的,則意味著它一旦創建便無法更新。如果這樣做a += 1,我們實際上5并沒有更新到6。在下面的動畫中,我們可以看到:
1)a最初指向5。
2)a += 1運行,并將指針從5移到6,實際上并沒有改變number 5。
列表和字典等可變數據類型的行為有所不同。它們可以被更新。因此,例如,讓我們列出一個非常簡單的列表:
如果將a附加3到此列表的末尾,我們不僅會指向list_1其他列表,還會直接更新現有列表:
即使我們創建了多個列表變量,只要它們指向同一個列表,更改該列表時它們也會全部更新,如下面的代碼所示:
這是上面代碼中實際發生的動畫的可視化:
這解釋了為什么在我們較早地嘗試使用列表和字典時更改了全局變量的原因。由于列表和字典是可變的,因此更改它們(即使在函數內部)也將更改列表或字典本身,而對于不可變的數據類型則不是這種情況。
保持可變數據類型不變
一般來說,我們不希望函數更改全局變量,即使它們包含諸如列表或字典之類的可變數據類型也是如此。那是因為在更復雜的分析和程序中,我們可能經常使用許多不同的功能。如果所有人都在更改他們正在處理的列表和詞典,則很難跟蹤正在更改的內容。
值得慶幸的是,有一個簡單的方法可以解決此問題:我們可以使用內置的Python方法來復制列表或字典.copy()。
如果您尚未了解方法,請不要擔心。它們在我們的Python中級課程中已涉及到,但是對于本教程而言,您需要知道的是它的.copy()工作方式如下.append():
讓我們再來看一下我們為列表編寫的函數,并對其進行更新,以使函數內部發生的變化不會改變initial_list。我們需要做的就是將傳遞給函數的參數從initial_list更改為initial_list.copy()
如我們所見,這解決了我們的問題。原因如下:using .copy()創建列表的單獨副本,因此指向initial_list自身的a_list是新副本,而不是指向自身initial_list。a_list之后,對該單獨的列表(而不是列表initial_list本身)進行的任何更改,因此的全局值initial_list不變。
但是,該解決方案仍然不是完美的,因為.copy()每次傳遞參數給函數時,我們都必須記住要添加,否則就有可能意外更改的全局值initial_list。如果我們不想為此擔心,我們實際上可以在函數內部創建該列表副本:
通過這種方法,我們可以像initial_list函數一樣安全地傳遞一個可變的全局變量,并且不會更改全局值,因為函數本身會創建一個副本,然后對該副本執行其操作。
該.copy()方法也適用于詞典。與列表一樣,我們可以簡單地添加.copy()參數到傳遞函數的位置,以創建一個副本,該副本將用于該函數,而無需更改原始變量:
但是,再次使用該方法意味著我們需要記住.copy() 每次將字典傳遞給make_percentages()函數時都要添加。如果我們要經常使用此函數,則最好將復制實現到函數本身中,這樣就不必記住這樣做了。
在下面,我們將.copy()在函數本身內部使用。這將確保我們可以在不更改作為參數傳遞給它的全局變量的情況下使用它,python函數控制列表和詞典https://www.aaa-cg.com.cn/data/2321.html并且無需記住要.copy()為傳遞的每個參數添加參數。
如我們所見,修改函數以創建字典的副本,然后僅在該副本中將計數更改為百分比已使我們能夠執行所需的操作,而無需實際更改content_ratings。
結論
在python函數控制列表和詞典中,我們研究了可變數據類型和可變數據類型之間的區別,可變數據類型可以更改,可變數據類型不能更改。我們了解了如何使用該方法.copy()制作可變數據類型(如列表和字典)的副本,以便我們可以在不更改其全局值的情況下在函數中使用它們。
https://www.toutiao.com/i6836270942046388748/