一、關鍵字
golbal nonlocal
在局部修改全局的變量為什么會報錯
count = 0
def func():
count += 1
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解釋器認為:如果你在局部作用域對一個變量進行修改了,你在局部作用域已經定義好這個變量了。
解釋器認為: 如果你在局部作用域對一個變量進行修改,name你在局部作用域已經定義好這個變量了。
1. global (***)
用途
- 可以在局部作用域申明一個全局變量
例題
def func():
global name # 用法
name = 'alex'
print(locals())
func()
# 總結
# 申明一個變量的方法:global name
- 可以在局部修改一個全局變量
例題
count = 0
def func():
global count
count += 1
print(count)
func()
print(count)
# 輸出結果
0
1
總結:
# 程序從上往下執行,先定義一個局部變量count = 0,然后往下執行,到print(count),這時候count指向的還是0,到func()也就是變量名加括號,開始執行定義函數,進入函數內部,聲明count為全局變量,然后對count進行修改+1,跳出函數執行print(count),這個時候count已經+1操作,結果是1
2. nonlocal (了解)
用途
- nonlocal不能操作全局變量
- nonlocal 可以對父級作用域的變量進行修改,並且在當前作用域創建
例題
def func():
count = 0
def inner():
nonlocal count
count += 1
print(count)
print(locals())
inner()
print(locals())
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 在沒有申明一個nolocal的情況下,定義函數在子局部對父局部的變量進行修改也會報錯,原因如下:
# 解釋器認為:如果你在局部作用域對一個變量進行修改了,
# 你在局部作用域已經定義好這個變量了。
一句話總結
全局有count = 0 這個變量,或者在函數內部申明一個global count,此時在局部才可以對全局變量進行修改
# 正確的操作方法
count = 0
def func():
global count
count += 1
return count
print(func())