一、變量的修改
我們都知道,在程序中根據變量的作用域的不同可以把變量分為全局變量與局部變量。在函數中的變量如果沒有特別聲明即使變量名與全局變量名完全一致也不會對全局的變量產生影響,如下面這個例子所示:

由於作用域的不同,在函數中不經過特殊聲明是不會改變全局變量“name”的值的。要想在函數的作用域中修改全局變量,我們可以利用global關鍵字:
如上圖所示,通過global關鍵字我們可以在函數這個局部作用域中修改全局變量。
二、列表的修改
對於列表,我們進行這樣的操作:
(1)如下圖:

同樣,如果我們直接進行修改list1中的內容還是不行。只有在函數中利用global關鍵字聲明后才能修改全局變量:

(2)但是,如果我們進行下面這樣的修改:

當我們在函數中給列表后面追加一個數字6后,最終打印出來的list1里面竟然有函數中追加的結果!我們再來進行其他的操作試試:

我們竟然也能在函數這個局部作用域中進行元素的刪除操作!
其實,從占內存的角度講,列表本身的內存地址與列表中的元素的內存地址是不一樣的。對於列表而言,列表本身只是一個元素的容器,它與里面的元素毫無關系。就好比箱子與貨物的關系一樣,貨物裝到箱子里是為了處理起來方便,而它與箱子本身沒有任何關系。
這下大家應該清楚了,當我們試圖去修改列表的時候,程序會將列表以及列表中的元素看做是一個整體“變量”,它們的處理符合全局變量與局部變量的邏輯;而我們要改變列表中具體元素的時候程序會在內存中獨立為列表中的元素創建或者刪除空間,與這個元素以及列表所在的作用域沒有關系。
其實,對於列表、字典、集合這樣的數據結構以及類、對象中的元素我們都可以在函數中修改;而對於數字、字符串這樣的數據類型只有在函數中利用global關鍵字聲明后才能對全局變量進行修改!
