python学习记录六(函数基础补充)

在学习完函数编程后,发现又有一个很小但是很重要的问题,那就是python变量的作用域,本文整理了python中变量的作用(全局变量和局部变量)

作用域

既然要谈到局部变量和全局变量,那么就不可避免的需要说一下python中的作用域划分python中主要有4个作用域分别为

Local function:局部作用域(函数内部)
enclosing function locals:外部嵌套函数作用域
Globals module:函数定义模块(文件)作用域
Builtin:python内置模块作用域
这四个作用域合成LEGB四大金刚

让我们画图来感受一下这四个作用域的关系:
这里写图片描述
那么在访问变量的顺序如下:

Locals function -->enclosing function locals --> Globals module -->Builtin

让我们举一个栗子

 v = 100
 def fun1():
     v= 200
     print("fun1.v = ",v)
     def fun2():
         v=300
         print('fun2.v=',v)
     fun2()
 fun1()
 print("全局的v = ",v)

这里写图片描述

函数嵌套

在一个函数内嵌套定义另一个函数

def fun_outer():
    print("fun_outer has been called")
            #在此处创建另一个函数,并在下面调用
    def fun_inner():
        print("fun_inner has been called")
    fun_inner()     #the first  called
    fun_inner()     #the second called
    print("fun_outer has been called")
 fun_outer()
 f = fun_outer()

这里写图片描述

局部变量

一般定义在函数内部的变量称为局部变量,函数调用时被创建,函数调用结束后如果不返回的话,局部变量就会被销毁

def fx(c):
    print("hello")
    d = 400     #局部变量2:d
    a = 10      
    print("world")
    print(a,b,c,d,sep=" =>") 
fx(300)
print(c)        #error,函数调用结束c已经被销毁
print(d)        #error,函数调用结束d已经被销毁

注意:因为python中没有指针传只的概念,那么如果不是用return来返回变量,那么变量永远就只能在函数内部使用。

全局变量

广泛的来讲就是定义在函数之外的,再python中模块内部的变量称为全局变量,对于同一模块的所有函数都可以在自己的函数体内访问全局变量,但是却不能根据赋值语句来改变全局变量的值。

a = 200
b = 100
def fx(c):      #局部变量1:c
    print("hello")
    d = 400     #局部变量2:d
    a = 10      #此语句只能创建临时局部变量a不能改变全局变量a
     print("world")
     print(a,b,c,d,sep=" =>")  #100,200,300,400
print(a)    #200在函数外查看a的值依旧是200

在看完全局变量&局部变量&作用域的基本定义和使用规则之后我们就会发现,python中对于全局变量和局部变量重名的情况下完全不会有覆盖情况,也就是在函数内部并不能直接修改全局变量,显然这是不合理的,那么下来就开始解决这个问题:

global

使用global生命一个或者多个变量的作用域是模块级的(即全局)

v= 200
def fn():
    global v      #声明v为全局变量
    v = 200
fn()
print("v= ",v)

nonlocal

声明一个变量的作用域是enclosing function locals

var = 100
def f1():
    var = 200
    print("f1里的var =",var)
    def f2():
        nonlocal var #声明var为f2以外,全局变量以内
        var = 300
     f2()
     print("f1调用结束var =",var)
f1()
print("全局的var =",var)

猜你喜欢

转载自blog.csdn.net/patrisk/article/details/80888752