網頁

2019年4月5日 星期五

Python Scopes and Namespaces

以下內容是要解釋Python document裡9.2.的內容(Python Scopes and Namespaces)


namespace(有時也稱為context)指的是從name(key)到object(value)的mapping,就像是一號代表甲同學,二號代表乙同學。其中Python的namespace又可分為:
1. global name (在mudule裡)
2. local name (在function或者method invocation)
3. built-in name (內建function或者內建exception)
4. non-local name (在enclosing function裡)

scope是指可以直接access namespace的範圍內。

儘管scope是由靜態決定,但它們是被動態使用。 在執行期間至少有三個nest scopes讓這些namespace可以直接被access:
1. 最內層scope包含local names(最先搜索)
2. 任何enclosing functions的scope包含non-local,non-global names(從最鄰近的封閉範圍開始搜索)
3. 倒數第二個scope包含當前module的global names
4. 最外面的scope包含built-in names的namespace(最後搜索)

下面簡單的例子可以用來解釋上面四種情形。



雖然執行函式順序是x="local_outer" -> x="local_middle" -> x="nonlocal",但是當執行到middle()時,x變成middle: nonlocal。因此可以呼應第一點(最內層最先搜索)。再來,def inner()執行x=nonlocal只影響到def middle(),因此可以呼應第二點(從最鄰近的封閉範圍開始搜索)。

下面例子只是想確認如果enclosing function沒有assign nonlocal x的話,enclosing function的變數是受到上一層函式影響。




參考

1 則留言: