黑马程序员技术交流社区

标题: Python3 命名空间和作用域 (下) [打印本页]

作者: 小江哥    时间: 2020-1-10 19:58
标题: Python3 命名空间和作用域 (下)
全局变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
实例(Python 3.0+) #!/usr/bin/python3

total = 0 # 这是一个全局变量

# 可写函数说明

def sum( arg1, arg2 ):   

#返回2个参数的和."

    total = arg1 + arg2 # total在这里是局部变量.   

print ("函数内是局部变量 : ", total)   

return total

#调用sum函数

sum( 10, 20 )

print ("函数外是全局变量 : ", total)
以上实例输出结果:
函数内是局部变量 :  30函数外是全局变量 :  0
global 和 nonlocal关键字 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
以下实例修改全局变量 num:
实例(Python 3.0+)#!/usr/bin/python3

num = 1

def fun1():   

global num  # 需要使用 global 关键字声明   

print(num)     

num = 123   

print(num)

fun1()

print(num)
以上实例输出结果:


1123123
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
实例(Python 3.0+) #!/usr/bin/python3

def outer():   

num = 10

    def inner():

        nonlocal num   # nonlocal关键字声明        

num = 100        

print(num)

    inner()   

print(num)

outer()


以上实例输出结果:
100100另外有一种特殊情况,假设下面这段代码被运行:
实例(Python 3.0+) #!/usr/bin/python3

a = 10

def test():

    a = a + 1

    print(a)

test()


以上程序执行,报错信息如下:
Traceback (most recent call last):  

File "test.py", line 7,

in <module>    test()  

File "test.py",

line 5,

in test    a = a + 1

UnboundLocalError: local variable 'a' referenced before assignment错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。
修改 a 为全局变量,通过函数参数传递,可以正常执行输出结果为:
实例(Python 3.0+) #!/usr/bin/python3 a = 10def test(a):    a = a + 1    print(a)test(a)

执行输出结果为:
11










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2