python屬性訪問的優先規則 及 變量做用域

變量做用域

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

  1. a.__dict__['x']
  2. type(a).__dict__['x'],
  3. 逐級(mro)找出 type(a) 的超類(不包括 metaclasses) 的 dict[‘x’]

A.x的搜索鏈:作用域

  1. A.__dict__['x'],
  2. 逐級(mro)找出 type(a) 的超類(不包括 metaclasses) 的 dict[‘x’]
相關文章
相關標籤/搜索