python的作用域

在python中,變量查找遵循LGB原則,即優先在局部作用域(local scope)中對變量進行查找,失敗則在全局作用域(global scope)中進行查找,最後嘗試再內建作用域(build-in scope)內查找,如果還是未找到的話,則拋出異常。後來由於閉包和嵌套函數的出現,作用域又增加了外部作用域,這樣變量的查找作用域優先級變爲:局部、外部、全局和內建。

作用域由def、class、lambda等語句產生,if、try、for等語句並不會產生新的作用域,也就是說if/elif/else、try/except/finally、for/while 並不能涉及變量作用域的更改,在他們的代碼塊中的變量,在外部也是可以訪問的.

局部作用域中不應對全局變量進行賦值

需要注意的是雖然我們可以在函數中對全局的變量進行訪問,但一旦局部作用域中對全局變量進行了賦值操作,python解釋器就不會從全局作用域中查找,而會拋出UnboundLocalError錯誤.該規則在由局部作用域向外部作用域查找時同樣有效.

   #!/usr/bin/python
   #coding:utf-8
   
   def printNum():
       print "num : %d" % num#可以讀取全局變量
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."

   #!/usr/bin/python
   #coding:utf-8
   
   def printNum():
       num += 5#給全局變量賦值錯誤
       print "num : %d" % num
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."



局部作用域中使用 global實現對全局變量進行賦值

#!/usr/bin/python
#coding:utf-8
   
   def printNum():
       global num#如果需要給全局變量賦值,加上global
       num += 5
       print "num : %d" % num
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."



局部作用域中全局變量應是隻讀是不準確的

 #!/usr/bin/python
 #coding:utf-8
 
 def printNum():
     global num
     num += 5
     print "num : %d" % num
     
 def printArray():
     ary.append("hello")#可以改變全局變量
     
     global ary#如果直接賦值的話會出錯,所以需要加上global
     ary = ["new array"]
     print ary
     
 num = 10
 ary = ["one"]
 
 if __name__ == "__main__":
     print "num is: %d" % num
     print "array is :",ary
     printNum()
     printArray()
 else:
     print "not in main..."


全局作用域指的是本模塊而不是程序 

在變量查找時只會在本模塊範圍內進行變量的查找,即使使用from xxx import *也不會垮模塊查找。在python中導入一個模塊可以理解爲是將另外一個模塊各變量賦值給當前模塊的同名變量, 對當前模塊中變量的賦值不會影響到導入模塊的變量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章