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
新闻热点
疑难解答