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

問題的由來

有個學生問我一個問題關於函數內部變量的咱們來一塊兒看下代碼: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。

相關文章
相關標籤/搜索