About 2 min


1. 全局变量

a = 1

if a:
    aa = 2

def f():
    b = 1

if __name__ == '__main__":
    c = 0

    for i in range(10):
        print(i)
        if i == 5:
            k = 10
    print('global', i, k)
    # global 9 10

    j = 0
    while j < 10:
        if j == 9:
            l = 10
        j += 1
    print('global', j, l)
    # global 9 10

只要是在函数外面,都是全局变量,a,aa, c, i, k(甚至循环内的也是)

函数里面,则是局部变量,b.

2. 同名的局部变量和全局变量

a = 8

def f1():
    # 只获取全局变量的值,可以
    print('f1', a)

def f2():
    '''
    同名的局部变量的特殊之处:不论先后位置,只要有定义局部变量,函数任何位置都会屏蔽掉外面的全局变量。
    也就是说在f2()运行到print('f2', a)时, 看不见外面的a, 而print('f2', a)之后a = 10才定义。
    UnboundLocalError: cannot access local variable 'a' where it is not associated with a value
    '''
    print('f2', a)
    a = 10

def f3():           
    '''
    同理, 看不见外面的a, 从而想在定义中引用全局变量的值, 但实则引用的是未定义的局部变量
    UnboundLocalError: cannot access local variable 'a' where it is not associated with a value
    '''
    a = a + 10
    a += 10
    print('f3', a)

def f4():
    # 
    a = 10
    print('f4', a)

def f5():
    global a
    print('f5', a)
    a = 18
    print('f5', a)

print(a)    # 8
f1()        # f1 8
# f2()
print(a)    # 8
# f3()
f4()        # f4 10
print(a)    # 8
f5()        # f5 8, f5 10
print(a)    # 18
  • 函数内部,可以直接访问全局变量的值,也可以定义局部变量来覆盖全局变量,但不可以修改(都会被视为未定义的局部变量)
  • 值得注意,f4()屏蔽了全局变量,局部变量怎么赋值、修改,都不会影响外面的全局变量。
  • 可以使用global关键字来修改全局变量。