問題的由來
有個學生問我一個問題關于函數内部變量的我們來一起看下代碼:
Code1
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才可以?那我們看下面的代碼
Code2
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我就可以修改全局變量呢?
問題解釋
在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代碼中
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()
總結:
從上面的結果看,我們思考可以得出一個結論,函數内部是否可以直接修改全局變量的本質就是"它是否是明确的"
仔細想想,就會發現不止dict不需要global,在函數内部所有”明确的“東西都不需要global。
因為int類型str類型之類的,隻有一種修改方法,即x = y, 恰好這種修改方法同時也是建立變量的方法,是以産生了歧義,不知道是要修改還是建立。
而dict/list/對象等,可以通過dict['x']=y或list.append()之類的來修改,跟建立變量不沖突,不産生歧義,是以都不用顯式global。

作者:羅天帥
出處:http://www.cnblogs.com/luotianshuai/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。