在函數中修改列表及列表中的元素

  1、變量的修改數據結構

  咱們都知道,在程序中根據變量的做用域的不一樣能夠把變量分爲全局變量與局部變量。在函數中的變量若是沒有特別聲明即便變量名與全局變量名徹底一致也不會對全局的變量產生影響,以下面這個例子所示:函數

  因爲做用域的不一樣,在函數中不通過特殊聲明是不會改變全局變量「name」的值的。要想在函數的做用域中修改全局變量,咱們能夠利用global關鍵字:
spa

  如上圖所示,經過global關鍵字咱們能夠在函數這個局部做用域中修改全局變量。對象

  2、列表的修改blog

  對於列表,咱們進行這樣的操做:內存

  (1)以下圖:作用域

  一樣,若是咱們直接進行修改list1中的內容仍是不行。只有在函數中利用global關鍵字聲明後才能修改全局變量:字符串

  (2)可是,若是咱們進行下面這樣的修改:容器

 

  當咱們在函數中給列表後面追加一個數字6後,最終打印出來的list1裏面居然有函數中追加的結果!咱們再來進行其餘的操做試試:變量

  咱們居然也能在函數這個局部做用域中進行元素的刪除操做!

  其實,從佔內存的角度講,列表自己的內存地址與列表中的元素的內存地址是不同的。對於列表而言,列表自己只是一個元素的容器,它與裏面的元素毫無關係。就比如箱子與貨物的關係同樣,貨物裝到箱子裏是爲了處理起來方便,而它與箱子自己沒有任何關係。

  這下你們應該清楚了,當咱們試圖去修改列表的時候,程序會將列表以及列表中的元素看作是一個總體「變量」,它們的處理符合全局變量與局部變量的邏輯;而咱們要改變列表中具體元素的時候程序會在內存中獨立爲列表中的元素建立或者刪除空間,與這個元素以及列表所在的做用域沒有關係。

   其實,對於列表、字典、集合這樣的數據結構以及類、對象中的元素咱們均可以在函數中修改;而對於數字、字符串這樣的數據類型只有在函數中利用global關鍵字聲明後才能對全局變量進行修改!