1、作用域基本規(guī)則
(1) 變量名引用查找,首先是本地,其次是函數(shù)內(nèi),然后是全局,最后是內(nèi)置。(2) 所有def函數(shù)內(nèi)賦值的變量名,默認均是本地變量,除非在之前聲明為全局變量。(3) 在def函數(shù)之外給一個變量名賦值時,本地作用域與全局作用域是相同的。>>> (a, b, c) = (1, 2, 3) # 定義全局變量a, b, c>>> def fun1(): a = 11 # a變量在方法fun1內(nèi)定義,默認是本地變量 def fun2(): b = 21 # b變量在方法fun2內(nèi)定義,默認是本地變量 PRint a, b, c # a和b是本地變量,c是全局變量 fun2()>>> fun1()11 21 3>>> a, b, c # a和b沒有被修改(1, 2, 3)2、全局變量
(1) 跨文件訪問在文件mymod.py中valA = 13valB = "Hello World"訪問mymod模塊。
>>> import mymod # import導(dǎo)入mymod>>> print mymod.valA # 訪問mymod模塊的變量valAHello World>>> mymod.valB += 3 # 修改mymod模塊的變量valB>>> print mymod.valB16(2) 文件內(nèi)函數(shù)訪問
在函數(shù)中訪問全局變量。>>> x = "Hello World!">>> def fun(): print x # 直接訪問變量x>>> fun()Hello World!(3) 函數(shù)內(nèi)修改全局變量
在函數(shù)內(nèi)對任何一個變量的賦值,都會在本地變量上修改。除非調(diào)用global,聲明該變量為全局變量。>>> x = "Hello World!">>> def fun(): global x # 聲明x是全局變量 x = "welcome" # 重新對x賦值>>> fun()>>> x'welcome'(4) global聲明變量可以在全局沒有聲明過。
>>> def fun(): global b # 變量b沒有在全局被定義過 b = 17>>> b # b沒有被定義Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> bNameError: name 'b' is not defined>>> fun() # 調(diào)用方法fun,b被定義為全局變量>>> b173、循環(huán)中訪問變量
嵌套函數(shù)在調(diào)用時才會使用變量,這時候參數(shù)都是同一個值。>>> L = [1, 2, 3, 4, 5]>>> actions = []>>> for x in L: def fun(): # 定義方法fun print x ** 2, # 使用循環(huán)中的變量x actions.append(fun)>>> for ac in actions: ac()25 25 25 25 25在方法中添加參數(shù)記錄值。
>>> actions = []>>> for x in L: def fun(i = x): # 定義方法fun,設(shè)置參數(shù)i print i ** 2, actions.append(fun)>>> for ac in actions: ac()1 4 9 16 254、訪問函數(shù)內(nèi)的本地變量。
>>> def fun1(): param = 12 # param是一個本地變量 def 4fun2(): print param # 可以訪問變量param param = 13 # 修改param的值,會引發(fā)異常 fun2()>>> fun1()Traceback (most recent call last): File "<pyshell#132>", line 1, in <module> fun1() File "<pyshell#131>", line 6, in fun1 fun2() File "<pyshell#131>", line 4, in fun2 print paramUnboundLocalError: local variable 'param' referenced before assignment
新聞熱點
疑難解答