先來看下面的代碼及執行結果:html
a = 1 b = [2,3] def nums(): a = 2 b[0] = 0 print(a) print(b) print(a) print(b) nums() print(a) print(b)
結果:python
1 [2, 3] 2 [0, 3] 1 [0, 3]
對上面結果的分析:函數
函數 nums() 中從新定義了一個變量 a ,這個 a 是局部變量,與外面的全局變量沒有關係,而全局變量 列表 b 直接被引用過來進行修改了,一樣是全局變量爲何會有差異呢?ui
由於格式問題引起了歧義,容器類型的數據如,列表,字典,他們的修改和建立書寫格式全然不一樣,不會引起奇異,而數字,字符串類型變量的定義和修改都是用 = 連接,引起了格式上的歧義,因此,當Python解釋器遇到函數中的 「a = 2」這種格式時,不知道是 「引用全局變量a修改成2」 仍是 「定義一個等於 2 的變量」 ,從而引起歧義,爲了確保全局變量對代碼其餘部分產生更小的影響,Python默認爲第二種——從新定義一個變量,來避免修改全局變量對總體代碼產生其餘未知影響。code
綜上所述:htm
本質:格式引起的歧義問題blog
運用:對於字典,列表不會由於格式問題引起歧義的,不用管他;對於數字,字符串來講,當引用與建立發生歧義時,Python解釋器默認建立新的變量,若不想建立,只是想修改全局變量,須要加global聲明,另外,若是隻是單純的引用全局變量,而不會產生歧義的,如 對於全局變量 a 來講,b = a + 5,這裏只是單純的使用,不會產生格式上的歧義問題,也不須要加global。字符串