6.5 局部变量和全局变量

6.5.1 局部变量

局部变量,就是在函数内部定义的变量,不同的函数,可以定义相同的名字的局部变量,各自的使用不会产生影响。

变量的使用范围就是它的作用域,局部变量的作用域仅限于定义它的这个函数内部。

6.5.2 全局变量

全局变量是在函数外部定义的变量。

全局变量的作用域从定义全局变量的语句开始直到py文件结束,包括其中的函数。

例如:6.10-作用域.py

# 作用域
# 第一句全局变量num
num = 100

def func():
    print(num)

# 第一句函数调用
func()
# 第二句全局变量num
# num = 100

这时,num的作用域为第二行到结束,所以func的函数中可以使用num,输出结果为:

100

如果将第一句全局变量num注释掉,启用第二句全局变量num:

# 作用域
# 第一句全局变量num
# num = 100

def func():
    print(num)

# 第一句函数调用
func()
# 第二句全局变量num
num = 100

func函数调用的位置在num作用域之外,所以结果为:

Traceback (most recent call last):
  File "c:/Projects/kejian/python/code/ch06/6.10-作用域.py", line 11, in <module>
    func()
  File "c:/Projects/kejian/python/code/ch06/6.10-作用域.py", line 7, in func
    print(num)
NameError: name 'num' is not defined

6.5.3 局部变量和全局变量的使用

当一个变量名在全局域中定义,在局部也有出现时,要遵守以下规则:

1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,而不管全局域中有没有该变量名。可以视为局部变量屏蔽了全局变量。例如:

# 全局变量num
num = 100
def func():
    # 虽然有了全局变量num,但是在函数中,出现在=左边,则这个num为局部变量。
    num = 123
    # 之后的变量使用,则认为是使用了局部变量。
    print(num)

func()

结果为:

123

2.函数内部的变量名如果第一次出现,且出现在=后面,且该变量在全局域中已定义,则这里将引用全局变量,如果该变量在全局域中没有定义,会出现“变量未定义”的错误。

# 全局变量num
num = 100
def func():
    # num出现在=右边直接使用,则这时在使用全局变量num
    x = num + 100
    print(x)

func()

结果为:

200

只要是使用变量,而该变量在全局域中有定义,在局部没有定义,则会使用全局变量。

为了避免以上同名变量引发的全局变量和局部变量的区分,一般不建议全局变量和局部变量重名,避免程序难以读懂。

6.5.4 global语句

在函数内部默认只能引用全局变量,而不能对其修改,因为同名的变量名一旦出现在=左边,则是作为局部变量使用的。

如果想要在函数体内修改全局变量的值,就要使用global关键字。

例如:6.11-global语句.py

# 全局变量num
num = 100

def func():
    # 使用global声明接下来的num是全局变量。
    global num
    # 对全局变量num赋值
    num = 200
    # 也可对全局变量num修改
    num += 100
    # 这里打印的也是全局变量num的值
    print(num)

func()
print(num)

结果为:

300
300