Python 变量作用域范围

#Python的以函数为界限划分变量范围
#最外层函数以外是全局变量叫做global,
#最内层函数以内是局部变量叫做local,
#其他的叫做nonlocal
#If while for try等不进行作用域Scope划分,和C是有区别的。

a=10#全局
def Fnc1():
    b=11#非局部
    def Fnc1_1():
        c=12#非局部
        def Fnc1_1_1():
            d=13#局部
if 1:
    f=14 #全局的变量

print(f)#正常打印
#print(b)#出错找不到b


#非全局范围访问全局变量,可以不声明
def Fnc10():
    print("global f =",f,sep=' ')
#非全局范围修改全局变量,必须要声明
def Fnc11():
    f=10#看似修改了f,实则新建了一个local变量f
    print("local f =",f,sep=' ')

Fnc11()  
print("global f =",f,sep=' ')#真正的全局变量没有变

def Fnc12():
    global f #声明全局变量,下面用的就是全局变量了
    f=10
    print("global f =",f,sep=' ')

Fnc12()  
print("global f =",f,sep=' ')#真正的全局变量没有变

#能不能在不声明全局变量的前提下,在非全局下访问全局变量
#并创建一个相同名称的变量并使用
#不行会报错,在一个范围内不能包含相同名称的全局和非全局变量
def Fnc13():
    #f=10+f #想用全局变量+10赋给非全局变量,运行报错
    print("global f =",f,sep=' ')

Fnc13()  
print("global f =",f,sep=' ')#真正的全局变量没有变

#global 可以在任何地方声明一个全局变量,如果这个变量没有就创建
def Fnc14():
    global g #声明全局变量,这个全局变量没有,就创建一个,但是后使用时要先赋值再访问,直接访问报错
    g=10

Fnc14()  
print("global g =",g,sep=' ')#访问到了函数内部创建的全局变量

#全局变量声明能否跨函数
#不能,函数是划分作用域的
def Fnc15():
    #global g #声明全局变量,注释掉不报错
    def Fnc16():
        global g #注释掉报错
        g+=10 #不可以直接用,需要再次声明

    Fnc16()
    
Fnc15()


#非局部声明
def Fnc17():
    h=11
    def Fnc18():
        #global h#如果这样声明,显然是新建了一个全局变量h
        #h+=10 #不声明同样可以访问不能赋值
        print(h)
    Fnc18()

Fnc17()

def Fnc19():
    h=11
    def Fnc20():
        nonlocal h#h显然不是全局变量,又不是Fnc20的局部变量,所有叫做非局部
        h+=10 #不声明同样可以访问不能赋值
        print(h)
    Fnc20()
    print(h)
Fnc19()

#能不能越界访问非局部
def Fnc21():
    h=11
    def Fnc22():
        h=13
        def Fnc23():
            nonlocal h#访问的13
            h+=10 #不声明同样可以访问不能赋值
            print("Fnc23",h,sep=' ')
        Fnc23()
        print("Fnc22",h,sep=' ')
    Fnc22()
    print("Fnc21",h,sep=' ')
Fnc21()


#如果22没有变量h那么23会访问21的h,一直向前找找到h为止
def Fnc21():
    h=11
    def Fnc22():
        #h=13
        def Fnc23():
            nonlocal h#访问的13
            h+=10 #不声明同样可以访问不能赋值
            print("Fnc23",h,sep=' ')
        Fnc23()
        print("Fnc22",h,sep=' ')
    Fnc22()
    print("Fnc21",h,sep=' ')
Fnc21()

#如果非全局中没有变量,那么nonlocal会找到全局中去吗,
#不能,报错,只能在非全局里面找,找不到就报错
p=10
def Fnc21():
    def Fnc22():
        p=10#屏蔽掉报错
        def Fnc23():
            nonlocal p
            p+=10 
            print("Fnc23",p,sep=' ')
        Fnc23()
        print("Fnc22",p,sep=' ')
    Fnc22()
    print("Fnc21",p,sep=' ')
Fnc21()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值