zoukankan      html  css  js  c++  java
  • python函数的 全局变量与局部变量

    一、函数的全局变量

    1、什么是全局变量

    顶着头开始写,没有任何缩进,在py文件的任何位置都能调用

    #!/usr/bin/env  python
    # _*_ coding:utf8 _*_
    name="gouguoqi"
    
     
    
    name="gouguoqi"
    def change_name():
        print ("111",(name))  #这里的name就是调用的全局变量
    change_name()
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    111 gouguoqi

     

    2、全局变量与局部变量的区别

    name="gouguoqi"
    def change_name():
        name="miaoye"   #局部变量
        print ("111",(name)) #这打印的是局部变量
    change_name() #这里函数调用的是局部变量的name
    print (name) #这里是是调用的函数外面的全局变量
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    111 miaoye
    
    gouguoqi

    3、global  关键字。想要在函数里面修改全局变量应该如何做

    global name,就代表调用全局的变量name

    专业的说法是global 后面的name是一个指针,一个内存地址,直接调用的那个内存地址

    调用之后在子程序(局部程序)里面再次给name赋值的话就修改了全局变量name了

    name="gouguoqi"
    def change_name():
        global name
        name="miaoye"
        print ("111",(name))
    change_name()
    print (name)
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    111 miaoye
    
    miaoye

    全局作用域是全局

    局部作用于是局部

    变量调用的顺序是先找局部作用域,如果找不到,再往外层找,然后在找全局作用域

    4、人性化的描述全局变量和局部变量

    我们把全局变量当做是一个盒子,局部变量是这个盒子里面的小盒子。这些小盒子是同一个级别的,当程序运行的时候,是从上到下的运行方式,碰到函数之后,先不运行,继续往下走,直到调用函数的时候,才打开函数的子程序进行赋值运行然后出结果

    当自己的盒子里面没有要寻找的变量的时候,就去盒子外面找,外面没有,再去全局找

    如果函数内部没有globe关键字,优先读取局部变量,能读取全局变量,无法对全局变量重新赋值,但是对于可变类型,可以对内部元素进行操作,可以append

    如果函数中有golobe关键字,变量本质上就是全局的那个变量,可读取,可重新赋值

    (4).1  如果函数中无global关键字,优先读取局部变量,能读取全局变量,无法对全局变

    量重新赋值,但是对于可变类型,可以对内部元素进行操作,可以append remove clear

    如果声明了局部变量,就调用局部变量

    如果没有声明局部变量,就会调用全局变量

    name="苍老师"  #这是真正的苍老师肉体
    def gou():
        name = "娃娃"
        print ("我要搞",name)
    def miao():
        name = ""
        print ("我要搞",name)
    
    def bei():
        print ("我要搞",name)
    gou()
    miao()
    
    bei()
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    我要搞 娃娃
    
    我要搞 基
    
    我要搞 苍老师

    如果变量是一个可变的类型,可以用方法来进行apped  remove  clear

    name=["苍老师","波多野吉衣"]
    def gou():
        name.append("")
        print ("我要搞",name)
    gou()
    
    print (name)
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    我要搞 ['苍老师', '波多野吉衣', '']
    
    ['苍老师', '波多野吉衣', '']

    (4).2如果函数中有global关键字,变量本质上就是全局的那个变量(指针),可读取,可赋值

    在局部子程序调用全局变量(如果只是调用的话相当于做蜡像)

    name="苍老师"  #这是真正的苍老师肉体
    
    def gou():
        global name #相当于做了一个苍老师的蜡像,跟本人一模一样
        print ("我要搞",name)
    def miao():
        name = ""
        print ("我要搞",name)
    gou()
    miao()
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    我要搞 苍老师
    
    我要搞 基

    (4).3在局部变量中修改全局变量(修改的话相当于玩过了,感觉不过瘾,就换人了)

    name="苍老师"  #这是真正的苍老师肉体
    def gou():
        global name  #相当于玩了苍老师的肉体
        name = "波多野吉衣"  #感觉不是很好,把苍老师换成了波多野吉衣
        print ("我要搞",name)
    def miao():
        print ("我要搞",name)#因为上面已经换人了,所以下面这人玩的也是波多野吉衣
    gou()
    miao()
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    我要搞 波多野吉衣
    
    我要搞 波多野吉衣

    (4.)4  错误示例,局部变量也有name,全局变量也有name,并且全局变量在局部变量下面的位置

    代码过程是,首先定义了一个全局变量,在局部子程序首先设置了相同名字的局部变量,再引用了全局变量,然后在去打印的时候,就不知道打印的到底是全局变量还是局部变量了,这样写是不行了,所以以后要养成一个习惯就是global一定要放到上面,再工作中我们定义全局变量最好用大写,局部变量小写,这样下面函数一调用 我们一看是大写的就知道是全局变量了

    name="gouguoqi"
    def change_name():
        name = "阿猫"
        global name
        print ("111",(name))
    change_name()
    
    C:python35python3.exe D:/pyproject/day14函数/全局变量和局部变量.py
    
    111 阿猫
    
    D:/pyproject/day14函数/全局变量和局部变量.py:19: SyntaxWarning: name 'name' is assigned to before global declaration
    
      global name

    (4).5函数中嵌套函数

    函数的执行过程

    name="北爷"   #1 第一步 定义全局变量name
    def huangwei():  #2 第二步 定义一个函数,到49行第二步结束,把这些都放到内存里面加载上,并没有执行
        name = "黄伟" #4.1  定义局部变量name
        print (name) #4.2 打印局部变量name的值  "黄伟"
        def liuyang(): #4.3 定义一个函数,然后把这段到47行的代码又放入了内存,等待下次调用
            name = "刘洋" #4.4.1定义局部变量name
            print (name) #4.4.2打印出局部变量name "刘洋"
            def nulige():#4.4.3  又遇到def了。又把这一部分到45行的代码放入了内存,没有执行。等待下次调用
                name = "喵爷"#4.4.5.1定义了一个局部变量name
                print (name)#4.4.5.2打印局部变量name的值"喵爷"
            print (name)#4.4.4 打印name 刘洋
            nulige()#4.4.5 调用nulige这个函数,开始向上找
        liuyang()#4.4 调用liuyang这个函数,开始向上找
        print(name) #4.5 第五步 打印name 这时候的name的值是"黄伟"
    print(name) #3 第三步  打印name 这时候name="北爷"
    huangwei() #4 第四步 执行huangwei这个函数,开始向上找他
    print(name)#5第五步 打印全局变量name
    def gou():#1
        name = ""#2.1
        print (name)#2.2
        def mao():#2.3
            name = ""#2.4.1
            print (name)#2.4.2
            def zhu():#2.4.3
                name = ""#2.5.1.1
                print (name)#2.5.1.2
            zhu()#2.5.1
            print(name)#2.5.2
        mao()#2.4
        print (name)#2.5
    gou()#2
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    狗
    
    猫
    
    猪
    
    猫
    
    狗
    Name = "beiye"  #1  定义一个全局变量
    def weihou(): #2 把从函数到143行的放入内存中,等待被调用
        name = "沉着"#4.1 定义一个局部变量name = 沉着
        def weiweihou(): #4.2 又遇到def  把到141行的代码再次放入内存,等待被调用
            global Name#4.3.1
            Name = "冷静"#4.3.2 把全局变量修改为 "冷静"
        weiweihou()#4.3 调用weiweihou ,开始向上找这个函数
        print(name)#4.4 打印下这个级别的name 是 沉着
    print(Name)#3 打印一下全局变量 Name 等于 beiye
    weihou()#4 调用函数 weihou,开始网上找 weihou这个函数
    print(Name) #5 打印下全局变量  这时候全局变量是冷静了
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    beiye
    
    沉着
    
    冷静

    那我要是想修改我上一级的name呢,而不是修改全局的name呢该怎么做呢

    nonloca 这个关键字就是修改上一级的变量的,我们来测试下,还是上面的例子,改变下

    nonlocal  修改上一级的变量

    Name = "beiye"  #1  定义一个全局变量
    def weihou(): #2 把从函数到143行的放入内存中,等待被调用
        name = "沉着"#4.1 定义一个局部变量name = 沉着
        def weiweihou(): #4.2 又遇到def  把到141行的代码再次放入内存,等待被调用
            nonlocal name#4.3.1
            name = "冷静"#4.3.2 把上一级的name变量修改为 "冷静"
        weiweihou()#4.3 调用weiweihou ,开始向上找这个函数
        print(name)#4.4 打印下这个级别的name 是 沉着
    print(Name)#3 打印一下全局变量 Name 等于 beiye
    weihou()#4 调用函数 weihou,开始网上找 weihou这个函数
    print(Name) #5 打印下全局变量  这时候全局变量是冷静了
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    beiye
    
    冷静
    
    beiye
  • 相关阅读:
    Mysql存储过程和函数
    python反编译chm文件并生成pdf文件
    python转换html到pdf文件
    python获取系统开机时间
    OpenSL ES: 利用OpenSL ES实现录音功能
    android: 根据文件uri 获取文件名
    Java: InputStream转化为byte数组
    Linux: 查看二进制文件
    Vim: 回到上次编辑的位置
    LayoutInflate: Avoid passing null as the view root
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9153381.html
Copyright © 2011-2022 走看看