在自定義函數時,有時候需要引用函數外的一些全局變量,如果不需要修改全局變量的內容,則可以直接引用,像下面這樣:
c = 999
def func():
print(c)
if __name__ == '__main__':
func()
函數的作用只是輸出變量 c 的值,並未對 c 進行修改,所以不會報錯。但如果想要在函數內部對全局變量進行一個修改,則需要使用global關鍵字,
c = 999
def func():
for i in range(10):
c += 1
if __name__ == '__main__':
func()
print(c)。
上面的代碼中,在func函數中嘗試修改 c 這個變量,但會出現如下錯誤:
UnboundLocalError: local variable ‘c’ referenced before assignment
意思是:賦值之前引用了局部變量。global關鍵字可以解決這個問題,如下:
c = 999
def func():
global c # 在修改前使用global關鍵字
for i in range(10):
c += 1
if __name__ == '__main__':
func()
print(c)
另外,global還可以幫助我們在函數內部聲明一個全局變量,如下:
def func():
global c # 在函數內部聲明一個全局變量
c = 100
if __name__ == '__main__':
func()
print(c)
nonlocal的作用於global類似,只不過global是在函數內部引用/修改全局變量,而nonloca是在內層函數中引用/修改外層函數定義的局部變量(非全局變量)。這種現象也成為閉包。
def func():
c = 100
def foo():
for i in range(10): # 對外層函數的c變量進行修改
c += 1
foo()
print(c)
if __name__ == '__main__':
func()
報錯如下:
UnboundLocalError: local variable 'c' referenced before assignment
與上面的錯誤相同,但這時候不能再使用global關鍵字了,而要使用nonlocal關鍵字,(如果使用了global,則相當於又聲明的一個新的變量)
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! '''
def func():
c = 100
def foo():
nonlocal c
for i in range(10): # 對外層函數的c變量進行修改
c += 1
foo()
print(c)
if __name__ == '__main__':
func()
這樣就不會報錯了,輸出結果是110.
總的來說:global關鍵字用來在函數或其它局部作用域中使用全局變量。但是如果不使用全局變量也可以不適用global關鍵字聲明,nonlocal關鍵字用來在函數或其它作用域中使用外層(非全局)變量。