有個學生問我一個問題關於函數內部變量的咱們來一塊兒看下代碼:python
Code1app
1 x = 50 2 3 4 def func(): 5 print(x) 6 global x 7 print("x修改前的值:", x) 8 x = 2 9 print("x修改後的值:", x) 10 11 func() 12 13 """ 14 輸出結果爲: 15 50 16 x修改前的值: 50 17 x修改後的值: 2 18 """
咱們知道咱們要在函數內部修改全局變量必須使用global才能夠?那咱們看下面的代碼函數
Code2spa
1 test_dict = {"name": "luotianshuai", "age": 18} 2 3 4 def func(): 5 print(test_dict) 6 print("修改前:", test_dict) 7 test_dict["age"] = 16 8 print("修改後:", test_dict) 9 10 func() 11 12 """ 13 輸出結果: 14 {'name': 'luotianshuai', 'age': 18} 15 修改前: {'name': 'luotianshuai', 'age': 18} 16 修改後: {'name': 'luotianshuai', 'age': 16} 17 """
額?問題來了爲何不用global我就能夠修改全局變量呢?code
在Code1代碼中對象
1 x = 50 2 3 4 def func(): 5 x = 2 6 """ 7 x = 2 這段代碼是有歧義的,由於它便可表示引用全局變量x,也能夠表示建立一個局部變量 8 因此在python中,默認它的行爲是建立局部變量,除非顯式聲明global. 9 """ 10 11 func()
在Code2代碼中blog
test_dict = {"name": "luotianshuai", "age": 18} def func(): print(test_dict) print("修改前:", test_dict) test_dict["age"] = 16 """ test_dict["age"] 它是「明確的」,由於若是把d看成是局部變量的話,它會報KeyError 因此它只能是引用全局的d,故不須要畫蛇添足顯式聲明global。 """ print("修改後:", test_dict) func()
總結:class
從上面的結果看,咱們思考能夠得出一個結論,函數內部是否能夠直接修改全局變量的本質就是"它是不是明確的"test
仔細想一想,就會發現不止dict不須要global,在函數內部全部」明確的「東西都不須要global。變量
由於int類型str類型之類的,只有一種修改方法,即x = y, 剛好這種修改方法同時也是建立變量的方法,因此產生了歧義,不知道是要修改仍是建立。
而dict/list/對象等,能夠經過dict['x']=y或list.append()之類的來修改,跟建立變量不衝突,不產生歧義,因此都不用顯式global。