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

xiaoxiao2021-02-28  21

在学习完函数编程后,发现又有一个很小但是很重要的问题,那就是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)
转载请注明原文地址: https://www.6miu.com/read-2250337.html

最新回复(0)