2018.12.11——全局变量与局部变量

一、局部变量与全局变量

1. 例子:

name='lhf'
def yangjian():
    global name
    name='东方今典'
    print('我要',name)
def shizhengwen ():
    global name
    name='sssssss'
    print('我要',name)
yangjian()
shizhengwen()

输出结果:

 

2.如果将上述代码yangjian()和shizhengwen()

颠倒顺序:

name='lhf'
def yangjian():
    global name
    name='东方今典'
    print('我要',name)
def shizhengwen ():
    print('我要',name)

shizhengwen()

yangjian()

则根据“从上到下”的执行顺序,输出结果为:

 3.总结例子:

例1:

name='产品经理'
def yangjian():
    global name  #已经声明name=产品经理 是全局变量
    print('我要搞',name)
    name='小东北'  #修改全局变量为小东北
    print('我要搞',name)
def shizhengwen ():
    name='史政文'
    
    print('我要搞',name)
yangjian()
shizhengwen()

#输出结果:
#我要搞 产品经理
#我要搞 小东北
#我要搞 史政文

#
如果函数的内容里面没有global关键字,优先读取里面的的局部变量,如果没有局部变量则只能读取全局变量。而且无法对全局变量进行赋值操作(如:name='史珍香'),
但是对于可变对象(如列表),
则可以对其内部元素进行操作,如(.append)
#如果函数里面有global关键字,那么后面的name本质上就是全局变量,可以读取,可以赋值

 

 例2:

如果函数的内容里面没有global关键字,优先读取里面的的局部变量,如果没有局部变量则只能读取全局变量。而且无法对全局变量进行赋值操作(如:name='史珍香'),
但是对于可变对象(如列表),则可以对其内部元素进行操作(如.append)
name=['产品经理','廖博士']
def qupengfei():
    name.append('田振龙')
    print('我要搞',name)
qupengfei()

输出结果:


二、全局变量、局部变量与函数的嵌套:
例1:
name='海风'
def huangwei():
    name='黄伟'
    print(name)
    def liuyang ():
        name='刘洋'
        print(name)
        def nulige():
            name='沪指花'
            print(name)
        print(name)
        nulige()
    liuyang()
    print(name)


huangwei()

#输出结果:
#黄伟
#刘洋
#刘洋
#沪指花
#黄伟

解析:!!!!!

 

 例2:

name='刚娘'
def weihou():
    name='陈卓'
    def weiweihou():
        global name
        name='冷静'
    weiweihou()
    print(name)
print(name)
weihou()
print(name)

获得结果:刚娘,陈卓,冷静

例3:引入nonlocal ——代指上一级的变量:

name='刚娘'
def weihou():
    name='陈卓'
    def weiweihou():
        nonlocal  name  ####
        name='冷静'
    weiweihou()
    print(name)
print(name)
weihou()
print(name)

输出结果:刚娘,冷静,刚娘

 

 

 

三、简单的复习:

1.

name='alex'
def change_name():
    global name
    name='lhf'
    print(name)

#输出结果:输出不了结果,但是不报错

2.

name='alex'
def change_name():
    global name
    name='lhf'
    print(name)
    
change_name()

#输出结果:lhf

3.

name='alex'
def change_name():
    global name
    name='lhf'
    print(name)
    def foo():
        name='wu'
        print(name)
    foo()
    
change_name()


#输出结果:lhf  
#         wu

4.

name='alex'
def change_name():
    global name
    name='lhf'
    print(name)
    def foo():
        # name='wu'
        print(name)
    foo()
    
change_name()

#输出结果:lhf
#         lhf

在例4中,当foo执行的时候,发现自己的作用域之中没有name,于是按照顺序向上借name,离他最近的name就是change_name函数的作用域里面的规定的global name ‘lhf’,于是第二个打印的就是lhf!!!!

 

5.

name='alex'
def change_name():
    # global name
    # name='lhf'
    # print(name)
    
    def foo():
        # name='wu'
        print(name)
    foo()
    
change_name()

#输出结果:alex

 

6.

name='alex'
def change_name():
    # global name
    # name='lhf'
    # print(name)
    name='aaa'
    def foo():
        # name='wu'
        print(name)
    foo()
    
change_name()

#输出结果:aaa

 

 7.

name='alex'
def change_name():
    # global name
    # name='lhf'
    # print(name)
    name='aaa'
    def foo():
        # name='wu'
        nonlocal name
        print(name)
    foo()
    
change_name()

#输出结果:aaa

 8.

name='alex'
def change_name():
    # global name
    # name='lhf'
    # print(name)
    name='aaa'
    def foo():
        # name='wu'
        nonlocal name
        name='bbb'
        print(name)
    foo()
    
change_name()

#输出结果:bbb

9.

name='alex'
def change_name():
    # global name
    # name='lhf'
    # print(name)
    name='aaa'
    def foo():
        # name='wu'
        nonlocal name
        name='bbb'
        print(name)
    foo()
    print(name)
    
change_name()

#输出结果:bbb
#        bbb

 

posted @ 2018-12-12 10:37  木菲杨  阅读(188)  评论(0编辑  收藏  举报