上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.2 全局变量和局部变量
3.2.1 全局变量
函数外部(或称全局作用域,global scope)声明的变量,称为全局变量(global variable),这意味着全局变量在函数内部或外部都可以使用。例如:
x="global" def fun(): print("x inside :", x) fun() print("x outside:", x)
输出:
x inside : global x outside: global
如果试图在一个函数里修改一个全局变量。例如:
x="global" def fun(): x=x*2 print(x) fun()
则将产生错误(提示:“局部变量在赋值前被引用”的错误):
---------------------------------------------------------------------- UnboundLocalError Traceback(most recent call last) <ipython-input-3-ce8c348bb019> in <module>() 5 print(x) 6 ----> 7 fun() <ipython-input-3-ce8c348bb019> in fun() 2 3 def fun(): ----> 4 x=x*2 5 print(x) 6 UnboundLocalError: local variable 'x' referenced before assignment
由上例可知,函数fun()内部使用形如“x=”的语句就相当于定义了局部变量(local variable),因此,这个函数里的x就不是全局变量的那个x了,而等号的右侧的“x*2”试图使用这个还未定义的局部变量x,所以产生了上述错误。
那么,如何在函数内部对全局变量修改呢?方法是使用关键字global声明x是一个全局变量。例如:
def fun(): global x x=x*2 print(x) fun()
输出:
globalglobal
3.2.2 局部变量
可以在函数内部定义一个变量,这个变量只属于该函数,外部无法使用这个变量,该变量称为局部变量(local variable)。例如:
def fun(): y="local" fun() print(y) # 错:试图访问fun()函数的局部变量
执行后将产生“名字y没有定义”的错误:
--------------------------------------------------------------------------- NameError Traceback(most recent call last) <ipython-input-6-3facf76a0729> in <module>() 3 4 fun() ----> 5 print(y) #错:试图访问fun函数的局部变量 NameError: name 'y' is not defined
如果函数内部声明的局部变量和外部变量同名,则内部的局部变量会隐藏全局变量,即在函数内部使用这个名字访问的总是局部变量。例如:
x=5 #全局变量x def fun(): x=10 #定义了一个新的局部变量x print("local x:", x) fun() print("global x:", x)
输出:
local x: 10 global x: 5
总结
● 函数内部可访问但不能直接修改全局变量,必须用关键字global声明才能修改全局变量。
● 局部变量和外部变量同名,在函数内部通过这个名字访问的都是局部变量,除非用global声明为全局变量。函数外部不能访问局部变量。