作用域由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..."