zoukankan      html  css  js  c++  java
  • python 作用域

    在写作用域前,先来了解下局部变量和全局变量。理解局部变量和全局变量后,作用域的概念就很好理解了。

    局部变量:局部变量只能在局部访问到,当超过其作用域时,变失去作用。

    全局变量:无论在任何作用域都可以使用。当前作用域有相同变量名的局部变量时,局部变量生效。

    (忘记准确定义了,忘掉他吧)

     1、Python中无块集作用域

                Java/C#有块集作用域
                Python/JavaScript无块集作用域 
    所谓块集作用域,需要先了解Python的代码块概念。Python遵从严格的缩进标准,可以认为处在同一缩进之间的代码即为一个代码块。如if判断,for,while循环等。
     if 1==1:  #if,for 等构成一个代码块
        name = 'zhang'
    #代码块结束
     print(name)
    

      实际运行中,print(name)有输出值,但是其和if位于相同的缩进位置,也就是属于不同的代码块。因此,Python中没有块集作用域

     2、Python中以函数为作用域

    先来看个例子:

    def func():  #函数内定义的变量只能在函数内使用,无法再外部引用(以函数为作用域)
        name = 'zhang'
    print(name)
    >>>
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/s13/day10/作用域.py", line 11, in <module>
        print(name)
    NameError: name 'name' is not defined
    

      当运行上面这段代码时,报错了!Python语法中,函数体为单独的作用域。就行在运行代码时,遇到函数默认是不执行函数体里面的代码的,等待调用函数后才会执行。因此,函数内定义的变量只能在函数内调用。

    3、Python存在作用域链,当前作用域找不到的话则往上找

    name = 'zhang'
    def func():
        name='a'
        #print(name)
        def f2():
            name='b'
            print(name)
        f2()
    func()
    >>>
    b
    

      变量name在func和f2中都有定义,执行func()的时候,先赋值name='a',然后执行f2(),重新定义name = 'b',在执行print(name)的时候,输出的结果为‘b’

    在函数未执行之前,作用域和作用域链以全部确定。

    name ='alex'
    def f1():
        print(name) #f1继承自己的作用域
        
    def f2():
        name = 'eric'
        f1()
    f2() #执行f1()
    >>>
    alex
    
    name = 'zhang'
    def f1():
        print(name)
    def f2():
        name = 'eric'
        #print(name)
        return f1
    ret = f2()
    ret()
    >>>
    zhang
    

      到这里,Python的作用域基本算整理完了,在编写Python文件的过程中,需要注意变量的作用域,以免使用变量的时候引用错误或者找不到变量。

    最后来个烧脑的,分析下最后的执行结果:

    li = [lambda :x for x in range(10)]
    r = li[0]()
    print(r)
    >>>
    9
    

      

    #li为列表

    #li内的元素为:lambda表达式,函数

    #函数在未调用前,内部代码不执行

    #li[0]的输出结果为一个个函数体的内存地址,即li[0]为函数

    #li[0]()执行函数

    #先执行for循环,循环的结果为9,然后把9赋值给x

    #因为for循环执行10次,所有li的长度为10,里面的每个元素都为9。(x相对于for循环来说位于循环之外,因此x获得的是for循环的执行结果,而不是0-9的值)

    最后推荐下武sir的《五句话搞定JavaScript作用域

  • 相关阅读:
    你认为做好测试计划工作的关键是什么?
    一套完整的测试应该由哪些阶段组成?
    你对测试最大的兴趣在哪里?为什么?
    如何测试一个纸杯?
    黑盒测试和白盒测试各自的优缺点
    在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    测试人员在软件开发过程中的任务
    软件测试分为几个阶段? 各阶段的测试策略和要求是什么?
    软件测试的策略
    软件产品质量特性
  • 原文地址:https://www.cnblogs.com/ernest-zhang/p/5662130.html
Copyright © 2011-2022 走看看