Python的做用域一共有4中,分別是:python
- L (Local) 局部做用域
- E (Enclosing) 閉包函數外的函數中
- G (Global) 全局做用域
- B (Built-in) 內建做用域
以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內建中找。bash
Python除了def/class/lambda
外,其餘如: if/elif/else/ try/except for/while
並不能改變其做用域。定義在他們以內的變量,外部仍是能夠訪問。閉包
注意:關於變量做用域,須要說明的是,當你在某個做用域內爲變量賦值時,該變量被Python解釋器自動視做該做用域的本地變量,並會取代任何上一層做用域中相同名稱的變量。這就可能會形成一些疑惑,以下:函數
>>> x = 10 >>> def foo(): ... x += 1 ... print x ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'x' referenced before assignment
由於x += 1至關於 x = x + 1,此處有對x賦值,因此按上面的解釋,python會默認x視爲本地局部變量,可是在本地局部變量列表確沒有這個變量,因此報錯ui
a = A()spa
a.x的搜索鏈:code
a.__dict__['x']
type(a).__dict__['x']
,A.x的搜索鏈:作用域
A.__dict__['x']
,