Python3从入门到实战
上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声明为全局变量。函数外部不能访问局部变量。