zoukankan      html  css  js  c++  java
  • day03-局部变量和全局变量

    变量的作用范围又叫作用域,根据变量的作用范围把变量分为:局部变量和全局变量。

    一个函数体内部调用另外一个函数,代码如下:

    1 def test(name,age=18,**kwargs):
    2     print(name)
    3     print(age)
    4     print(kwargs)
    5     logger("test")  #调用logger函数
    6 
    7 def logger(sounce):
    8     print("from %s"%sounce)

    ①logger函数之后执行

     1 def test(name,age=18,**kwargs):
     2     print(name)
     3     print(age)
     4     print(kwargs)
     5     logger("test")
     6 
     7 def logger(sounce):
     8     print("from %s"%sounce)
     9 
    10 test("zhou",age=23,sex="m",hobby="tesla") #在logger函数之后调用

    #输出

    zhou

    23

    {'hobby': 'tesla', 'sex': 'm'}

    from test

     

    ②logger函数之前执行

     1 def test(name,age=18,**kwargs):
     2     print(name)
     3     print(age)
     4     print(kwargs)
     5     logger("test")
     6 
     7 test("zhou",age=23,sex="m",hobby="tesla") #在logger函数之前调用
     8 
     9 def logger(sounce):
    10     print("from %s"%sounce)

    #输出

    zhou

    23

    {'hobby': 'tesla', 'sex': 'm'}

    Traceback (most recent call last):

      File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 12, in <module>

        test("zhou",age=23,sex="m",hobby="tesla")

      File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 10, in test

        logger("test")

    NameError: name 'logger' is not defined  #命名错误:logger没有被定义

    在logger函数之前执行,logger函数还没有被读到内存中,所以报错。

    1、局部变量

    局部变量:指在局部生效,定义在函数体内的变量只能在函数里面生效,出个这个函数体,就不能找到它,这个函数就是这个变量的作用域

     1 def test(name):
     2     print("before change:",name)
     3     name = "zhou"  #局部变量name,只能在这个函数内生效,这个函数就是这个变量的作用域
     4     print("after change:",name)
     5 
     6 name = "alex"
     7 print("-----调用test-----")
     8 test(name)
     9 print("------打印name----")
    10 print(name)

    #输出

    -----调用test-----

    before change: alex

    after change: zhou  #局部变量生效

    ------打印name----

    alex

     

    2、全局变量

    全局变量:指的是在整个程序中都生效的变量,在整个代码的顶层声明。

     1 school = "laonanhai edu"  #定义全局变量
     2 
     3 def test_1():
     4     print("school:",school)
     5 
     6 def test_2():
     7     school = "zhou linux "
     8     print("school:",school)
     9 
    10 print("------test_1----")
    11 test_1()
    12 print("------test_2----")
    13 test_2()
    14 print("----打印school--")
    15 print("school:",school)

    #输出

    ------test_1----

    school: laonanhai edu  #打印的是全局变量

    ------test_2----

    school: zhou linux  #打印局部变量

    ----打印school--

    school: laonanhai edu  #打印全局变量

    从上面的例子可看出全局变量的优先级是低于局部变量的,当函数体内没有局部变量,才会去找全局变量。

     

    ①函数里面修改全局变量

    • 改前用global先声明一下全局变量
    • 将全局变量重新赋值
     1 school = "laonanhai edu"  #定义全局变量
     2 
     3 def test():
     4     global school  #用global关键字声明全局变量
     5     school = "zhou linux "  #将全局变量重新赋值
     6     print("school:",school)
     7 
     8 print("------test_2----")
     9 test()
    10 print("----打印school--")
    11 print("school:",school)

    #输出

    ------test_2----

    school: zhou linux

    ----打印school--

    school: zhou linux #全局变量被改掉

     

    ②只在函数里面声明全局变量

    1 def test():
    2     global school  #只在里面定义全局变量
    3     school = "zhou linux"
    4     print("school:",school)
    5 
    6 print("--------test-------")
    7 test()
    8 print("-----打印school----")
    9 print("school:",school)

    #输出

    --------test-------

    school: zhou linux

    -----打印school----

    school: zhou linux

    也是可以的,但是我们最好不要用以上2种情况,也就是说最好不要用global这个关键字,因为你用了,其他人调你的函数时,就乱套了,而且还不好调试

     

    ③修改列表

     1 names = ['alex',"zhou"]  #定义一个列表
     2 
     3 def test():
     4     names[0] = "金角大王"
     5     print(names)
     6 
     7 print("--------test-----")
     8 test()
     9 print("------打印names--")
    10 print(names)

    #输出

    --------test-----

    ['金角大王', 'zhou']     #函数内的names输出

    ------打印names--

    ['金角大王', 'zhou']     #函数外的names输出

     

    注:从上面的例子可以看出,列表names被当做在函数中全局变量,重新赋值了,是可以被修改的。

    小结:1、只有字符串和整数是不可以被修改的,如果修改,需要在函数里面声明global。2、但是复杂的数据类型,像列表(list)、字典(dict)、集合(set),包括我们后面即将要学的类(class)都是可以修改的。

    总结

    1. 在子程序(函数)中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量。
    2. 全局变量的作用域是整个程序,局部变量的作用域是定义该变量的子程序(函数)。
    3. 当全局变量和局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其他地方,全局变量起作用。

     

  • 相关阅读:
    Package manager has died异常PackageInfo 引发 Crash
    Android Bitmap变迁与原理解析(4.x-8.x)
    Rxjava2不能再发射Null了
    [转]C语言的int最值问题,以及原码反码及补码
    自定义gradle插件
    ReentrantLock(重入锁)的使用
    HashSet、TreeSet和LinkedHashSet分别基于HashMap、TreeMap和LinkedHashMap
    Java类加载双亲委托模式优点
    为什么HTTPS比HTTP安全,以及两者的优缺点
    android4.4之后的HttpUrlConnection的实现是基于okhttp
  • 原文地址:https://www.cnblogs.com/Study-Blog/p/6681496.html
Copyright © 2011-2022 走看看