程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python系列教程182——內置作用域

編輯:Python

朋友們,如需轉載請標明出處:https://blog.csdn.net/jiangjunshow

聲明:在人工智能技術教學期間,不少學生向我提一些python相關的問題,所以為了讓同學們掌握更多擴展知識更好地理解AI技術,我讓助理負責分享這套python系列教程,希望能幫到大家!由於這套python教程不是由我所寫,所以不如我的AI技術教學風趣幽默,學起來比較枯燥;但它的知識點還是講到位的了,也值得閱讀!想要學習AI技術的同學可以點擊跳轉到我的教學網站。PS:看不懂本篇文章的同學請先看前面的文章,循序漸進每天學一點就不會覺得難了!

我們可以運行dir調用來看看python預定義了哪些變量名:

>>>import builtins
>>>dir(builtins)
['ArithmeticError','AssertionError','AttributeError','BaseException',
'BufferError','BytesWarning','DeprecationWarning','EOFError','Ellipsis',
...many more names omitted...
'print','property','quit','range','repr','reversed','round','set',
'setattr','slice','sorted','staticmethod','str','sum','super','tuple',
'type','vars','zip']

這個列表中的變量名組成了Python中的內置作用域。概括地講,前一半是內置的異常,而後一半是內置函數。由於LEGB法則Python最後將自動搜索這個模塊,將會自動得到這個列表中的所有變量名。也就是說,你能夠使用這些變量名而不需要導入任何模塊。因此,有兩種方法引用一個內置函數:通過LEBG法則,或者手動導入__builtin__模塊。

>>>zip # The normal way
<class 'zip'>
>>>import builtins # The hard way
>>>builtins.zip
<class 'zip'>

其中的第二種實現方法有時在復雜的任務中是很有用的。細心的讀者也許注意到了由於LEGB查找的流程,會使它在找到第一處變量名的地方生效。也就是說,在本地作用域的變量名可能會覆蓋在全局作用域和內置作用域中有著相同變量名的變量,而全局變量名有可能覆蓋內置的變量名。舉個例子,一個函數創建了一個名為open的本地變量並將其進行了賦值:

def hider():
open = 'spam' # Local variable,hides built-in
...
open('data.txt') # This won't open a file now in this scope!

這樣的話,就會將內置作用域的名為open的內置函數隱藏起來。這也往往是個Bug,並且讓人頭疼的是,因為Python對於這個問題並不會處理為警告消息(因為在高級編程的場合你可能會很想通過在代碼中預定義變量名來替代內置的變量名)。

函數也能夠簡單地使用本地變量名隱藏同名的全局變量。

X = 88 # Global X
def func():
X = 99 # Local X: hides global
func()
print(X) # Prints 88: unchanged

這裡,函數內部的賦值語句創建了一個本地變量X,它與函數外部模塊文件的全局變量X是完全不同的變量。正是由於這一點,如果在def內不增加global(或nonlocal)聲明的話,是沒有辦法在函數內改變函數外部的變量的。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved