• python函数变量的作用域声明(全局变量和局部变量)


    函数变量的作用域声明(全局变量和局部变量)

    引入问题:

     

    局部变量:

    局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了。

    例如:

    #encoding = utf-8

    def demo():

        tips = "No Smoking"

        print("函数内部变量tips:",tips)

    demo()

    print ("函数外部变量tips:",tips) 

     

     可以看到,如果试图在函数外部访问其内部定义的变量,会报NameError的错误

    全局变量

    1、全局变量:定义在函数外部的变量,作用域是整个程序。即可以在函数外部使用,也可以在函数内部使用。

    2、内部使用时,需要加global声明为全局变量。

    3、内部使用时,如果不想影响全局变量,那么就声明为局部变量。

     

    ===========================================================================================

    例如:

    #encoding = utf-8

    tips = "No Smoking"

    def demo():

        print("函数内部变量tips:",tips)   #仅在函数内部引用全局变量

    demo()

    print ("函数外部变量tips:",tips)

     

     ============================================================================================

    如果此时在函数内部对全局变量进行修改,会报错如下:

    #encoding = utf-8

    tips = "No Smoking"

    def demo():

        tips+="!"   #对全局变量进行修改

        print("函数内部变量tips:",tips)

    demo()

    print ("函数外部变量tips:",tips)

     

     原因:

    python解释器误把tips当成了局部变量,而此时在函数内部又没有对tips定义,所以报错。如果内部作用域想要改变外部作用域的值,需要加global。

    解决方法:

    1) 在函数内部对tips变量进行全局声明(使用global),这种方式会同步改变全局变量tips的值。

    2) 定义一个局部变量,用来存储修改后的值。tips只在函数内部被修改了。

    3) 在函数中定义一个与全局变量一样的tips。tips也只会在函数内部被修改。

    #修改方式1:

    #encoding = utf-8

    tips = "No Smoking"

    def demo():

        global tips   #使用global

        tips+="!"

        print("函数内部变量tips:",tips)

    demo()

    print ("函数外部变量tips:",tips)

      

    修改方式2:

    #encoding = utf-8

    tips = "No Smoking"

    def demo():

        new_tips = tips + "!"  #修改tips后的值 赋给新的变量

        print("函数内部变量new_tips:",new_tips)

    demo()

    print ("函数外部变量tips:",tips)

     

    修改方式3:

    #encoding = utf-8

    tips = "No Smoking"

    def demo():

        tips="No Smoking"    #声明为局部变量

        tips+="!"

        print("函数内部变量tips:",tips)

    demo()

    print ("函数外部变量tips:",tips)

     

     ==========================================================================================

    再看一个例子:

    List = [1,2,3]

    String = "hello"

    def demo():

        String = "hi"

        List[0] = "*"

        print("函数内部变量List:",List)

        print("函数内部变量String:",String)

    demo()

    print("函数外部变量List:",List)

    print("函数外部变量String:",String)

     

     疑问:为什么定义了一个全局变量列表,函数内部对其进行修改时,不加global也不会报错?

    原因:

    1) 对于函数内String = "hello",它是“有歧义的”,因为它既可以是表示引用全局变量String,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global。

    2) 而对于函数内的List[0] = "*",它是“明确的”,因为如果把List当作是局部变量的话,它会报NameError,所以它只能是引用全局的List,故不需要多此一举显式声明global。

    3) 而如果函数内的List变量写成 List=["*"],那么List也会变成局部变量

    4) 仔细想想,就会发现不止list不需要global,所有”明确的“东西都不需要global。因为int类型str类型之类的,只有一种修改方法,即x = y, 恰好这种修改方法同时也是创建变量的方法,所以产生了歧义,不知道是要修改还是创建。而dict/list/对象等,可以通过dict['x']=y或list.append()之类的来修改,跟创建变量不冲突,不产生歧义,所以都不用显式global

    因此解决了最开始的,为什么字符串要在函数内部声明为全局变量,而列表不用的问题。

     

    小结:

    1)引用全局变量,不需要golbal声明

    2)修改全局变量,需要使用global声明,

    3)特别地,列表、字典等可变类型如果只是修改其中元素的值,可以直接使用全局变量,不需要global声明。

    建议:

    1) 如果函数内想用外部的全局变量,那么就写成global

    2) 如果不想用外部的全局变量,那么就在函数内对变量做初始化(即声明局部变量)。

  • 相关阅读:
    HTML 5 使用 FileReader、FormData实现文件上传
    【JS深入学习】——事件代理/事件委托
    【JS深入学习】——函数创建和重载
    Yii
    YII简单的基于角色的访问控制
    怎样在Yii中显示静态页
    Yii framework 应用总结小窍门(转)
    Yii PHP 框架分析(四)
    Yii PHP 框架分析(三)
    Yii PHP 框架分析(二)
  • 原文地址:https://www.cnblogs.com/anne32184/p/13399973.html
Copyright © 2020-2023  润新知