python之旅基础——全局变量和局部变量

一、举例

全局变量:定义在函数之外,作用域为整个代码。

局部变量:定义在某个函数之内,作用域为该函数之中。在作用域外无法调用局部变量。

首先明确以下三点:

  1、程序是从上向下执行的。

  2、在执行函数过程中,如果本函数内部没有找到要执行的变量,将会在上一层函数中找,如果依然没有,将会在全局中找。

  3、函数在创建过程中不会被调用执行,只用在函数名+()时,才会被调用。

x = 10

def fun1():
    x = 5
    print(x)

def fun2():
    print(x)
    
fun1()
fun2()
print(x)

5    #调用fun1()过程中,函数内部就有x变量,所以获取后就被打印。
10    #调用fun2()过程中,函数内部没有x变量,所以在上一层找到全局变量x,获取后打印。
10    #执行print(x)代码时,获取全局变量x。这里同样说明的是,fun1()中的x的作用域只在函数fun1中,所以不会在全局中调用。

  

二、global关键字

  在函数内部,只能调用全局变量。但如果想更改全局变量,可以使用global关键字。

x = 10
def fun1():
    global x
    x = 5
    print(x)

def fun2():
    print(x)

print(x)                    #此时,打印全局变量x。
fun1()                      #调用fun1()函数,将全局变量x修改为5,并打印变量x(这个变量在函数内部,但是由于使用global关键字定义了x,那么x就是全局变量)。
fun2()                      #由于先调用了fun1(),此时全局变量已经被修改,所以打印出改变后的全局变量。
print(x)                    #此时,同样打印全局变量,但是由于fun1()执行在前,所以打印出改变后的全局变量。

  

10
5
5
5

 

  在下面的代码中,函数fun1()先定义了局部变量x,又将使用global关键字修改全局变量x。所有在fun1()中出现了同名的全局变量和局部变量,最终结果会报错。

x = 10

def fun1():
    x = 7
    global x
    x = 5
    print(x)

fun1()

  

E:\python视频\oldboy_python\venv\Scripts\python.exe E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py
File "E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py", line 111
global x
^
SyntaxError: name 'x' is assigned to before global declaration

  

三、嵌套函数

  在函数中创建函数,就实现了函数的嵌套。强调的是,函数只有被调用才会被执行,所以要注意写入调用语句。

x = 10

def fun1():
    x = 5
    print(x)

    def fun2():
        global x
        x = 7
        print(x)

    fun2()        #定义fun2()后,记得调用,否则fun2()将不会被执行
print(x) fun1()


10
5
7

 !!!从下面的代码中可以看出,嵌套层的函数只能调用上一层或者全局变量,不会对上一层的变量进行修改。上一层的函数不会调用嵌套层的变量。当fun1()最后print(name)时,依然获取的是本函数内的局部变量。

name = "x"
def fun1():
    name = "y"

    def fun2():
        global name
        name = "z"
    fun2()
    print(name)

print(name)             #这里获取到全局变量name,“x”
fun1()                  #调用fun1()函数。首先,获取到局部变量name,“y”;然后,调用嵌套函数fun2(),fun2()函数将全局变量name的值改为“z”;最后打印fun1()中的局部变量。
print(name)             #打印被修改过的全局变量name,“z” 

x
y
z

  

四、nonlocal关键字

根据上一个例子,可以看出嵌套层的函数只能调用上一层或者全局变量,不会对上一层的变量进行修改。但是可以通过nonloacl关键字,实现嵌套层对上一层的变量进行修改。

name = "x"

def fun1():
    name = "y"

    def fun2():
        nonlocal name
        name = "z"
    fun2()
    print(name)

print(name)             #调用全局变量name,“x”打印
fun1()                  #调用fun1()函数。首先,获取到局部变量name,“y”;然后,调用嵌套函数fun2(),fun2()函数将上一层fun1()中的name的值改为“z”;最后打印fun1()中的局部变量(此时name已经被修改成为“z”)。
print(name)             #全局变量没有发生改变。

x
z
x

  注:nonlocal关键字只用于嵌套函数中,如果只是一层函数,使用nonlocal关键字时,会报错。

name = "x"

def fun1():
    nonlocal name
    name = "y"
    print(name)

print(name)
fun1()
print(name)

File "E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py", line 92
nonlocal name
^
SyntaxError: no binding for nonlocal 'name' found


 

五、补充

  函数的作用域遵循LEGB规则。

   L:local  内部局部变量

   E:enclosing 嵌套局部变量,相对于local来说,就是外部局部变量

   G:global  全局变量

   B:built_in  内置函数创建的变量

  函数中的变量按照LEGB的规则进行查找

 

  分析下面代码的出错原因:

count = 10
def func():
    print(count)
    count = count + 1
func()

#报错信息:
#UnboundLocalError: local variable 'count' referenced before assignment

  在运行以上程序的时候,计算机首先将所有代码加载到内存,包括定义的func()函数。当最后遇到func()代码时,调用函数,执行函数内的代码。

  当运行到print(count)时,程序报错“局部变量"count"不能在定义前被引用”。也就是说,程序已经检测到func内部用count变量(这个变量和全局变量count=10不是同一个),程序简单的成为需要把count = count + 1先执行。

posted @ 2018-06-16 20:56  范先生学习python之旅  阅读(267)  评论(0)    收藏  举报