python3 变量的作用域

'''
globals()查看全局作用域
locals()查看当前作用域
'''
a = 10
def func():
    a = 20
    print(a)


func()  # 20
print(a)  # 10
'''
注意,在python中,变量是遵循就近原则的。
在函数外面的变量被称为全局变量,它的作用域是整个py文件。
在函数内部的变量被称为局部变量,作用范围仅限于函数内部。
我们可以通过globals()和locals()查看全局和局部作用域中的内容。
'''
a = 10
def func():
    a = 40
    b = 20
    def abc():
        print("abc")
    print(a, b)
    print(globals())
    print(locals())


func()  # 40 20
# {......, 'a': 10, 'func': <function func at 0x00000000029A58C8>}
# {'abc': <function func.<locals>.abc at 0x00000000029A5950>, 'b': 20, 'a': 40}


'''
global和nonlocal关键字
'''
a = 10
def func():
    a = 20
    print(a)


func()  # 20
'''
这种情况是正常的。接着看下面的情况:
'''
a = 10
def func():
    # a += 1  # 报错:UnboundLocalError: local variable 'a' referenced before assignment
    print(a)


func()
'''
注意报错那句话,这句话相当于a = a + 1先计算右边,右边会把全局变量a引入进来使用,然后重新赋值给a,但是,python中不允许函
数内部改变外面变量的值,这样做很不安全,python规定,在函数内部想要修改全局变量,必须使用global关键字把外面的变量引入才可
以进行修改(赋值)。
'''
a = 10
def func():
    global a
    a += 1
    print(a)


func()  # 11
'''
nonlocal也是一样的操作,它负责在内层函数中引入外层函数的局部变量。
'''
a = 10
def func():
    a = 20
    def inner():
        nonlocal a
        a = 30
        print(a)
    inner()
    print(a)


print(a)  # 10
func()  # 30 30
'''
不加nonlocal的情况
'''
a = 10
def func():
    a = 20
    def inner():
        a = 30
        print(a)
    inner()
    print(a)


print(a)  # 10
func()  # 30 20

 

posted on 2019-11-13 10:35  lilyxiaoyy  阅读(638)  评论(0编辑  收藏  举报

返回
顶部