局部变量

    在一个函数中定义的变量称为局部变量(local variable),因为它们的作用域局限于该 函数的函数体,在函数外部是没有定义的。例如:

    函数 func 中定义了局部变量 z。由于语句 print z 是 func 函数体内的语句,所以 可以访问 z。如果函数外部的 print 语句试图显示 z 的值,则会出错。例如接着上例继续 执行:

    1. Traceback (most recent call last):
    2. File "<pyshell#9>", line 1, in <module> print z
    3. NameError: name 'z' is not defined

    函数的形式参数也可以看作是函数的局部变量,即只能在函数体内访问。形式参数不同 于局部变量的是:形式参数的值是在调用函数时通过参数传递而来的。如上例中函数 func 有两个参数 x 和 y,当调用 func(1,2)时相当于执行了两个对局部变量的赋值语句 x = 1 和 y = 2。

    这里,x 和 z 是在函数 func 的外部定义的变量,它们虽然分别与 func 的形式参数 x 和局 部变量 z 同名,但实际上毫无联系。执行 func(x,z)时,Python 先在 func 外部计算 x 和 z 的值,然后将结果传递给 func 的形式参数 x、y,因此最终执行的是 func(1,2)。图 4.6 给出了这个过程的示意图。

    图 4.6 函数局部变量与外部变量同名 全局变量

    函数内部的变量具有局部性,这符合模块化编程思想的要求。作为一种模块化构件,函 数就像“黑盒”一样,其内部细节应该对外部不可见。同理,函数内部也不应直接使用外界 的东西。如果函数需要外界的数据,正确的做法是通过参数来传递给函数。也就是说,函数 的参数除了用于表示可变数据、增强函数的通用性之外,还应作为外界向函数传递数据(即使是一个固定不变的数据)的唯一渠道。下面是一个函数直接使用外界数据的例子:

    1. >>> s = "hello"
    2. >>> def f():
    3. >>> f()
    4. hello

    在实际应用中,可能会有多个函数共同操作(读取或修改)一个数据的情形,这时采用 参数传递的方式比较麻烦,而采用全局变量则显得直接了当。下面我们用一个简单程序说明 Python 中全局变量的用法。

    【程序 4.7】eg4_7.py

    1. def f():
    2. global x
    3. x = x + 1
    4. global x
    5. x = x - 1
    6. print x
    7. x = 0
    8. g()

    程序中定义了两个函数 f()和 g(),它们的函数体中都包含一条声明全局变量的语句: global x 意为本函数中所使用的 x 是在函数外部定义的全局变量。f()的功能是对全局变量 x 加 1,g()的功能是对全局变量 x 减 1。执行结果如下:

    可见执行 f()之后 x 变成了 1,再执行 g()又把 x 改回了 0。