0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python变量的作用域

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-03 16:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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
    +关注

    关注

    57

    文章

    4857

    浏览量

    89561
  • 作用域
    +关注

    关注

    0

    文章

    6

    浏览量

    6250
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解读

    使用广泛。 对于这样的设备,通常内存只有256B,那么能够给我们利用的资源就十分珍贵了。在这种情况下,如果我们只需要定义一个变量来存放布尔值,一般就申请一个整型变量,通过1和0来间接存储。但是,显然1和0
    发表于 12-05 06:45

    常用变量的介绍

    extern:用在全局变量上表示该变量在其他文件中已经定义;用在函数上作用同全局变量; static:用在全局变量上,和非静态全局
    发表于 11-21 07:05

    PLC中Static和Temp变量的区别

    大家好,收到粉丝投稿,让博主讲下Static变量和Temp变量的区别,新入行的兄弟可能会对这两个概念不太能理解。
    的头像 发表于 09-24 14:51 911次阅读
    PLC中Static和Temp<b class='flag-5'>变量</b>的区别

    termux如何搭建python游戏

    termux如何搭建python游戏 Termux搭建Python游戏开发环境的完整指南 一、Termux基础环境准备 Termux是一款无需root即可在安卓设备上运行的Linux终端
    发表于 08-29 07:06

    如何在嵌入式RF测试中实施多信号分析

    射频(RF)测试是嵌入式系统开发与验证中的关键环节,尤其是在电信、航空航天、汽车以及物联网等行业。随着嵌入式系统的日益复杂,传统RF测试方法往往难以捕捉多个(时间、频率、数字)信号之间的复杂相互作用。多
    的头像 发表于 08-15 16:32 2622次阅读
    如何在嵌入式RF测试中实施多<b class='flag-5'>域</b>信号分析

    python app不能运行怎么解决?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    发表于 08-06 06:27

    Ansible Playbook中的变量使用技巧

    在inventory中定义的连接变量(比如ansible_ssh_user);优先级第二。
    的头像 发表于 04-15 10:26 671次阅读

    零基础入门:如何在树莓派上编写和运行Python程序?

    在这篇文章中,我将为你简要介绍Python程序是什么、Python程序可以用来做什么,以及如何在RaspberryPi上编写和运行一个简单的Python程序。什么是Python程序?
    的头像 发表于 03-25 09:27 1518次阅读
    零基础入门:如何在树莓派上编写和运行<b class='flag-5'>Python</b>程序?

    是德示波器混合测试应用

    在电子技术飞速发展的今天,测试测量工具的性能和功能直接影响着技术突破和创新的速度。是德科技(KeysightTechnologies)作为全球领先的测试测量解决方案提供商,其示波器产品在混合测试
    的头像 发表于 02-22 11:18 672次阅读

    VirtualLab Fusion应用:光波导k布局可视化(“神奇的圆环”)

    ,光可以在TIR(全反射)作用下传播,并与光导表面上不同类型的光栅结构相结合,以耦合光进出。在VirtualLab Fusion中,k-Layout可视化工具提供了一种在k域中强大的图解方法,用于分析
    发表于 02-21 08:53

    Python绘图Matplotlib快速参考手册

     PYTHON
    发表于 02-07 14:04 0次下载

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2207次阅读

    混合示波器的原理和应用

    的原理和功能,在电子测量领域发挥着重要作用。随着无线通信、物联网等新兴应用的不断发展,混合示波器的应用前景将更加广阔。
    发表于 12-27 15:54

    振弦式应变计测出来的应变量有什么用

    ​在工程监测与科学研究等诸多领域中,振弦式应变计扮演着十分重要的角色,它所测出来的应变量更是蕴含着关键的信息,有着广泛且重要的作用。以下就让我们深入探讨一下其具体用处。一、在土木工程领域的应用桥梁
    的头像 发表于 12-10 15:35 841次阅读
    振弦式应变计测出来的应<b class='flag-5'>变量</b>有什么用

    傅立叶变换在图像处理中的作用

    傅里叶变换在图像处理中发挥着至关重要的作用。以下是傅里叶变换在图像处理中的几个主要作用: 一、图像增强与去噪 去噪 :图像中的噪声通常表现为高频分量。通过傅里叶变换,可以将图像从空间转换到频率
    的头像 发表于 12-06 16:55 3066次阅读