天天看點

Python【知識點】傻傻的函數内變量

問題的由來

有個學生問我一個問題關于函數内部變量的我們來一起看下代碼:

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。

Python【知識點】傻傻的函數内變量

作者:羅天帥

出處:http://www.cnblogs.com/luotianshuai/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

繼續閱讀