python作用域

作者: Tim在路上 | 来源:发表于2018-10-11 07:35 被阅读1次

    块级作用域??

    if 1 == 1:
        name = "lzl"
     
    print(name)
     
     
    for i in range(10):
        age = i
     
    print(age)
    lzl
    9
    

    java中是不可以执行成功的但是在python中可以执行成功,,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;

    函数局部作用域

    def  func():
        name = "zxt"
     
    print(name)
    
    name 'name' is not defined
    

    name变量只在func()函数内部中生效,所以在全局中是没法调用的;

    作用域误区

    name = "lzl"
     
    def f1():
        print(name)
     
    def f2():
        name = "eric"
        f1()
     
    f2()
    lzl
    

    我们都知道,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
    类似于下面的规则

    #作用域链
     
    name = "lzl"
    def f1():
        name = "Eric"
        def f2():
            name = "Snor"
            print(name)
        f2()
    f1()
    

    我们再看一个代码

     
    name = "lzl"
     
    def f1():
        print(name)
     
    def f2():
        name = "eric"
        return f1
     
    ret = f2()
    ret()
    lzl
    

    f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系.

    静态作用域

    i = 1
    
    def g():
        a = i
        a = a + 3
        print(i,a)
        
    g()
    1
    

    发现i可以找到全局变量
    但是

    i = 1
    
    def g():
        i = i + 1
        a = a + 3
        print(i,a)
        
    g()
    local variable 'i' referenced before assignment
    

    无法找到全局的i,原因是Python是静态作用域(词法作用域),因此在编译阶段,就决定了变量的读取方式。

    相关文章

      网友评论

        本文标题:python作用域

        本文链接:https://www.haomeiwen.com/subject/nvvjaftx.html