前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道Python中的4种变量作用域是哪些吗?

你知道Python中的4种变量作用域是哪些吗?

作者头像
lyhue1991
发布2020-07-20 15:26:07
2K0
发布2020-07-20 15:26:07
举报

01 作用域


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、赋值在前,引用在后

代码语言:javascript
复制
# ------同作用域内------
name = "MING"
print(name)

# ------不同作用域内------
name = "MING"
def main():
    print(name)

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

代码语言:javascript
复制
print(name)
name = "MING"

# UnboundLocalError: local variable 'name' referenced before assignment

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

代码语言:javascript
复制
# L -> E -> G -> B
# 从左到右,由低层到高层
def main():
    name = "MING"

print(name)
# NameError: name 'name' is not defined

02 闭包


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

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

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

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

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

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

代码语言:javascript
复制
def deco():
    name = "MING"
    def wrapper():
        print(name)
    return wrapper

deco()()
# 输出:MING

03 改变作用域


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

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

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

先来看个例子

代码语言:javascript
复制
def deco():
    age = 10
    def wrapper():
        age += 1
    return wrapper

deco()()

运行一下,会报错。

代码语言:javascript
复制
# UnboundLocalError: local variable 'age' referenced before assignment

但是这样就OK

代码语言:javascript
复制
def deco():
    age = 10
    def wrapper():
        nonlocal age
        age += 1
    return wrapper

deco()()
# 输出:11

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

代码语言:javascript
复制
def deco():
    age = 10
    def wrapper():
        print(age)
    return wrapper

deco()()
# 输出:10

04 变量集合


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

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

globals()

代码语言:javascript
复制
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()

代码语言:javascript
复制
other = "test"

def foobar():
    name = "MING"
    gender = "male"
    for key,value in locals().items():
        print(key, "=", value)

foobar()
# 输出
# name = MING
# gender = male
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法美食屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 作用域
  • 02 闭包
  • 03 改变作用域
  • 04 变量集合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档