Python中的全域性變數與區域性變數的區別
阿新 • • 發佈:2018-12-14
全域性變數與區域性變數兩者的本質區別就是在於作用域
用通俗的話來理解的話,
全域性變數是在整個py檔案中宣告,全域性範圍內都可以訪問
區域性變數是在某個函式中宣告的,只能在該函式中呼叫它,如果試圖在超出範圍的地方呼叫,程式就爆掉了
如果在函式內部定義與某個全域性變數一樣名稱的區域性變數,就可能會導致意外的效果,可能不是你期望的。因此不建議這樣使用,這樣會使得程式很不健全
直接來看幾個例子來理解全域性變數和區域性變數的區別吧:
def fun(x): y = 2 print("乘法的執行結果:", x * y) num = 1 print("初始值num =", num) fun(num) print("y的值是:",y)
執行結果:
報錯
Traceback (most recent call last):
初始值num = 1
File "C:/Users/Administrator.PC-20180904IFXJ/Desktop/project/list.py", line 277, in <module>
乘法的執行結果: 2
print("y的值是:",y)
NameError: name 'y' is not defined
報錯的原因是因為試圖訪問區域性變數,但是訪問的地方不在該變數y的作用域中
def fun(): num1 =2 print("函式內修改後num1=",num1) num1 =1 print("初始num1=",num1) fun() print("執行完函式後num1=",num1)
執行結果:
初始num1= 1
函式內修改後num1= 2
執行完函式後num1= 1
可以看到在函式內部對全域性變數的修改後,在函式執行完畢,修改的結果是無效的,全域性變數並不會受到影響
再看:
def fun():
num1 *=2
print("函式內修改後num1=",num1)
num1 =1
print("初始num1=",num1)
fun()
print("執行完函式後num1=",num1)
執行結果:
報錯了。這是因為在fun()函式使用了局部變數num1,它只是個跟全域性變數同名的區域性變數,使用前還是要賦值,因此再次強調不要這樣使用
global關鍵字
如果真的想要在函式體內修改全域性變數的值,就要使用global關鍵字
def fun():
global num1
num1 =2
print("函式內修改後num1=",num1)
num1 =1
print("初始num1=",num1)
fun()
print("執行完函式後num1=",num1)
執行結果:
使用global關鍵字就是告訴python編譯器這個變數不是區域性變數而是全域性變數,其實有點像是"引用"的意思
nonlocal關鍵字
再看看另一個跟變數相關的關鍵字nonlocal,字面意思就是指當前的這個變數不是區域性變數。nonlocal是Python3.0中新增的關鍵字,python2.x不支援
先來看看下面這段程式碼
def fun():
num2 =3
def fun2():
num2 *=2
print("num2=",num2)
return fun2()
fun()
- 執行結果:
錯誤的原因跟前面的差不多,就是使用了未定義的區域性變數,然而num2也不是全域性變數,只是fun2函式的外層變數,強行使用global定義num2的話同樣會報錯(不信你試試)
這時候需要使用nonlocal關鍵字:
def fun():
num2 =3
def fun2():
nonlocal num2
num2 *=2
print("num2=",num2)
return fun2()
fun()
執行結果:
num2= 6