首頁  >  文章  >  後端開發  >  關於nonlocal和global的詳細解析

關於nonlocal和global的詳細解析

Y2J
Y2J原創
2017-05-09 15:02:002649瀏覽

這篇文章主要給大家介紹了關於Python中關鍵字nonlocal和global的聲明與解析的相關資料,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。

一、Python中global與nonlocal 宣告

如下程式碼

a = 10 
 
def foo(): 
 a = 100

執行foo( ) 結果a 還是10

函數中對變數的賦值,變數總是綁定到函數的局部命名空間 ,使用global 語句可以改變這個行為

>>> a 
10 
>>> def foo(): 
...  global a 
...  a = 100 
... 
>>> a 
10 
>>> foo() 
>>> a 
100

解析名稱時先檢查局部作用域,然後由內而外一層層檢查外部巢狀函數定義的作用域,如找不到搜尋全域指令空間和內建命名空間。

儘管可以層層向外(上)查找變量,但是! ..python2 只支援最裡層作用域(局部變量)和全域命令空間(gloabl),也就是說內部函數不能給定義在外部函數中的局部變數重新賦值,例如下面程式碼是不起作用的

def countdown(start): 
 n = start 
 def decrement(): 
  n -= 1

python2 中,解決方法可以是把修改值放到列表或字典中,python3 中,可以使用nonlocal 宣告完成修改

def countdown(start): 
 n = start 
 def decrement(): 
  nonlocal n 
  n -= 1

二、Python nonlocal 與global 關鍵字解析

#nonlocal

首先,要先明確nonlocal 關鍵字是定義在閉包裡面的。請看以下程式碼:

x = 0
def outer():
 x = 1
 def inner():
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

結果

# inner: 2
# outer: 1
# global: 0

現在,在閉包裡面加入nonlocal關鍵字進行宣告:

x = 0
def outer():
 x = 1
 def inner():
  nonlocal x
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

結果

#
# inner: 2
# outer: 2
# global: 0

看到差別了麼?這是一個函數裡面再巢狀了一個函數。當使用 nonlocal 時,就宣告了該變數不只在巢狀函數inner()裡面
才有效, 而是在整個大函數裡面都有效。

global

還是一樣,看一個例子:

x = 0
def outer():
 x = 1
 def inner():
  global x
  x = 2
  print("inner:", x)

 inner()
 print("outer:", x)

outer()
print("global:", x)

結果

# inner: 2
# outer: 1
# global: 2

global 是對整個環境下的變數起作用,而不是對函數類別的變數起作用。

總結

【相關推薦】

1. Python免費影片教學

2. Python基礎入門教學

3. Python遇見資料擷取影片教學

以上是關於nonlocal和global的詳細解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn