python函数作用域与闭包_理解 Python 中的作用域和闭包

未经作者允许,请勿转载,违者必追究责任。

1. 作用域

Python的作用域可以分为四种:

L (Local) 局部作用域

E (Enclosing) 闭包函数外的函数中

G (Global) 全局作用域

B (Built-in) 内建作用域

变量/函数 的查找顺序: L –> E –> G –>B

意思是,在局部找不到的,便去局部外的局部作用域找(例如 闭包),再找不到的就去全局作业域里找,再找不到就去内建作业域中找。

会影响 变量/函数 作用范围的有

函数:def 或 lambda

类:class

关键字:global noglobal

文件:*py

推导式:[],{},()等,仅限Py3.x中,Py2.x会出现变量泄露。

1、赋值在前,引用在后

# ------同作用域内------

name = "MING"

print(name)

# ------不同作用域内------

name = "MING"

def main():

print(name)

2、引用在前,赋值在后(同一作用域内)

print(name)

name = "MING"

# UnboundLocalError: local variable 'name' referenced before assignment

3、赋值在低层,引用在高层

# L -> E -> G -> B

# 从左到右,由低层到高层

def main():

name = "MING"

print(name)

# NameError: name 'name' is not defined

2. 闭包

闭包这个概念很重要噢。你一定要掌握。

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。其实装饰函数,很多都是闭包。

好像并不难理解,为什么初学者会觉得闭包难以理解呢?

我解释一下,你就明白了。

一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

你可以看下面这段代码,就构成了闭包。在内函数里可以引用外函数的变量。

def deco():

name = "MING"

def wrapper():

print(name)

return wrapper

deco()()

# 输出:MING

3. 改变作用域

变量的作用域,与其定义(或赋值)的位置有关,但不是绝对相关。 因为我们可以在某种程度上去改变向上的作用范围。

关键字:global 将 局部变量 变为全局变量

关键字:nonlocal 可以在闭包函数中,引用并使用闭包外部函数的变量(非全局的噢)

global好理解,这里只讲下nonlocal。

先来看个例子

def deco():

age = 10

def wrapper():

age += 1

return wrapper

deco()()

运行一下,会报错。

# UnboundLocalError: local variable 'age' referenced before assignment

但是这样就OK

def deco():

age = 10

def wrapper():

nonlocal age

age += 1

return wrapper

deco()()

# 输出:11

其实,你如果不使用 +=、-=等一类的操作,不加nonlocal也没有关系。这就展示了闭包的特性。

def deco():

age = 10

def wrapper():

print(age)

return wrapper

deco()()

# 输出:10

1.5.4 变量集合

在Python中,有两个内建函数,你可能用不到,但是需要掌握它们。

globals() :以dict的方式存储所有全局变量

locals():以dict的方式存储所有局部变量

globals()

def foo():

print("I am a func")

def bar():

foo="I am a string"

foo_dup = globals().get("foo")

foo_dup()

bar()

# 输出

# I am a func

locals()

other = "test"

def foobar():

name = "MING"

gender = "male"

for key,value in locals().items():

print(key, "=", value)

foobar()

# 输出

# name = MING

# gender = male

更多相关推荐

python闭包变量作用域_Python学...

一、全局变量与局部变量一个模块中,最高级别的变量有全局作用域。全局变量一个特征就是:除非...

继续阅读

python什么是闭包的作用域_Pytho...

什么是闭包在维基中,闭包的解释是这样的:在计算机科学中,闭包(Closure)是词法闭包(LexicalC...

继续阅读

python 中函数对象、闭包、作用...

函数对象函数名是存放了函数的内存地址,存放了内存地址的变量都是对象,即函数名就是函数对象...

继续阅读

python函数作用域与闭包

L:local函数内部作用域E:enclosing函数内部与内嵌函数之间G:global全局作用域B:build_in内置作...

继续阅读

python 闭包函数的作用_理解Pyth...

1.定义闭包是函数式编程的一个重要的语法结构,函数式编程是一种编程范式(而面向过程编程和面...

继续阅读

python函数作用域_Python函数的...

作用域规则命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名...

继续阅读

python闭包变量作用域_Python闭...

Ihavethefollowingcodeinsideafunction:stored_blocks={}defreplace_blocks(m):block=m.group(...

继续阅读

python函数作用域_python函数作...

作用域变量到底是什么呢?可将其视为指向值的名称。因此,执行赋值语句x=1后,名称x指向值1。...

继续阅读

python函数中变量的作用域_Pytho...

在上次的学习中,初步认识了Python的自定义函数方式及变量参数。那么编程中的局部变量和全局变...

继续阅读