Python

Python 知识量:10 - 41 - 150

5.3 变量的作用域><

作用域的含义- 5.3.1 -

变量的作用域是指它在程序的哪些地方是可访问或使用的。这一规定对于保护数据和提供编程灵活性大有益处。Python中的变量按照作用域分可分为2种:

  • 局部变量

  • 全局变量

局部变量- 5.3.2 -

在Python中,首次赋值发生在函数内的变量称为局部变量。局部变量只能在其所属的函数内使用,在函数外部不能访问。当函数运行结束后,其局部变量将被自动删除。以下是一个示例:

# local.py
def add(a,b,c):
    s=a+b+c
    return s
def sub(a,b):
    s=a-b
    return s

在以上代码中,函数add中的变量s是其局部变量。此外参数也被视为局部变量,因此,函数add有4个局部变量:a、b、c、s。函数sub有3个局部变量:a、b、s。

需要注意的是,虽然函数add和sub中都有同名变量a、b、s,但实际上它们是不同的变量,只是正好名称相同而已。正因为作用域的限制,它们之间互不影响。

全局变量- 5.3.3 -

在函数外面声明的变量称为全局变量,在程序中的任何地方都可以访问它。正因如此,修改全局变量时应当非常小心。以下是一个示例:

# global.py
name='Jeff'
def hello():
    print('Hello '+name+' !')
def change(newName):
    name=newName

运行结果为:

>>> 
===================== RESTART: D:\PythonTestFile\global.py =====================
>>> hello()
Hello Jeff !
>>> change('Bob')
>>> hello()
Hello Jeff !

在以上代码中,首先创建了一个全局变量name,并初始化其值为“Jeff”。然后定义了一个打印name值的函数hello(),在其函数体中直接引用了变量name。最后又定义了一个用于改变name值的函数change()。

但是,程序的运行结果与期望的不太一致。第1次调用函数hello()得到的结果是符合预期的,但当调用了函数change(),修改了name值后,再次调用函数hello()得到的值却不是新值。究其原因是在函数change()中,变量name被视为了局部变量,即Python认为重新定义了一个局部变量name。如果要访问全局变量name,需要使用关键字global。修改后的代码如下:

# global.py
name='Jeff'
def hello():
    print('Hello '+name+' !')
def change(newName):
    global name
    name=newName

运行结果为:

>>> 
===================== RESTART: D:\PythonTestFile\global.py =====================
>>> hello()
Hello Jeff !
>>> change('Bob')
>>> hello()
Hello Bob !