函数---全局变量和局部变量及作用域

 

  • 全局变量

在函数外,一开始被赋予变量值,可以被所有函数使用的变量,作用域为全局,称为全局变量

  • 局部变量

在函数内部,只能在函数内使用,称为局部变量

举例

name = "lian"#全局变量
def call():
    name = "zong"# 局部变量
    print(name) #输出『zong』
print(name)#输出『lian』
  • 若想在函数内部修改全局变量,则需要使用global关键
注:global必须写在全局变量修改前
name ="lian" #全局变量
def foo():
    name ="zong"
    print(name)
    def bar():
        global name  #修改的为全局变量
        name ="sheng" #局部变量
        print(name)
    bar()
print(name) #函数没有执行前,故打印的还是原局部变量name
foo() #执行函数
print(name) #函数执行后,修改了全局变量为name =sheng
  • 若子函数内想修改父级函数的变量,则需要使用 nonlocal 键字
name ="lian" #全局变量
def foo():
    name ="zong"
    print(name)
    def bar():
        nonlocal name  #修改的为父级变量
        name ="sheng" 
        print(name) 
    bar()
print(name) #函数没有执行前,故打印的还是原局部变量name
foo() #执行函数
print(name) #函数执行后,修改了全局变量为name =lian
  •  

  • 变量作用域:

  • 变量的作用域有哪几种?
    
    L:local,局部作用域,即函数中定义的变量。
    
    E: enclosing,嵌套父级函数的局部作用域,即包含此函数的上级的局部作用域,但不是全局的;
    
    G: global,全局变量,就是模块级别定义的变量。
    
    B: built-in,系统固定模块里面的变量,比如 int,bytearray等。
    
    搜索变量的优先级顺序依次为:
    
      局部作用域 >外层作用域 >当前模块中的全局作用域 > python内置作用域,也就是 LEGB
    
x =int(1)  #python内置作用域---->B
inpara =2  #当前模块中的全局变量--->G
def outfunc():
    global  inpara
    print(inpara)
    inpara = 3 #外层作用域 --->E
    print(inpara)
    def infunc():
        inpara =4  #局部作用域 --->L
        print(inpara)
    infunc()

outfunc()

 

  • 同时我们需要知道的是,函数中变量的作用域只与函数的声明有关,而与函数的调用位置无关。

 函数名-->函数内存地址;函数名()-->执行函数,并且获取返回值。

name ="lian"
def foo():
    name ="zong"
    def bar():
        name = "sheng"
        def mitt():
           print(name)
        return mitt
    return bar

foo()()()
#相当于---------------
#bar =foo() #执行foo函数,并且获取bar函数内存地址,并且赋值给bar变量
#mitt =bar() #bar内存地址加括号->执行bar函数,并且获取mitt内存地址
#mitt() #mitt内存地址+括号-->执行mitt函数
 

如果变量作用域与函数调用位置有关的华,那么输出结果应该是lian,但是输出结果是sheng,这说明函数中变量的作用域与函数声明有关。

 

函数---全局变量和局部变量及作用域_第1张图片

 

 

你可能感兴趣的:(Python)