1、作用域基本規則
(1) 變量名引用查找,首先是本地,其次是函數內,然后是全局,最后是內置。(2) 所有def函數內賦值的變量名,默認均是本地變量,除非在之前聲明為全局變量。(3) 在def函數之外給一個變量名賦值時,本地作用域與全局作用域是相同的。>>> (a, b, c) = (1, 2, 3) # 定義全局變量a, b, c>>> def fun1(): a = 11 # a變量在方法fun1內定義,默認是本地變量 def fun2(): b = 21 # b變量在方法fun2內定義,默認是本地變量 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導入mymod>>> print mymod.valA # 訪問mymod模塊的變量valAHello World>>> mymod.valB += 3 # 修改mymod模塊的變量valB>>> print mymod.valB16(2) 文件內函數訪問
在函數中訪問全局變量。>>> x = "Hello World!">>> def fun(): print x # 直接訪問變量x>>> fun()Hello World!(3) 函數內修改全局變量
在函數內對任何一個變量的賦值,都會在本地變量上修改。除非調用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() # 調用方法fun,b被定義為全局變量>>> b173、循環中訪問變量
嵌套函數在調用時才會使用變量,這時候參數都是同一個值。>>> L = [1, 2, 3, 4, 5]>>> actions = []>>> for x in L: def fun(): # 定義方法fun print x ** 2, # 使用循環中的變量x actions.append(fun)>>> for ac in actions: ac()25 25 25 25 25在方法中添加參數記錄值。
>>> actions = []>>> for x in L: def fun(i = x): # 定義方法fun,設置參數i print i ** 2, actions.append(fun)>>> for ac in actions: ac()1 4 9 16 254、訪問函數內的本地變量。
>>> def fun1(): param = 12 # param是一個本地變量 def 4fun2(): print param # 可以訪問變量param param = 13 # 修改param的值,會引發異常 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
疑難解答