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

    关注

    56

    文章

    4793

    浏览量

    84635
  • 作用域
    +关注

    关注

    0

    文章

    6

    浏览量

    6115
收藏 人收藏

    评论

    相关推荐

    快速理解工业交换机中的冲突与广播

    工业交换机是工业通信网络的重要组成部分,其高效的数据传输功能对生产和管理起着关键作用。冲突与广播是工业网络中的两个重要概念。它们在网络设计与优化中扮演着不同的角色。本文将以简明易懂的方式介绍这两个概念,并探讨它们在工业交换机
    的头像 发表于 11-20 16:51 374次阅读
    快速理解工业交换机中的冲突<b class='flag-5'>域</b>与广播<b class='flag-5'>域</b>

    对比Python与Java编程语言

    使得编写代码更加灵活,但也可能导致运行时错误。 Java 语法相对冗长,需要显式声明变量类型,增加了代码的可读性和安全性。 静态类型系统在编译时进行类型检查,减少了运行时错误。 二、性能 Python 解释型语言,运行速度通常比Java慢,但对于许多应用场景
    的头像 发表于 11-15 09:31 291次阅读

    图纸模板中的文本变量

    “  文本变量和系统自带的内置变量,可以帮助工程师灵活、高效地配置标题栏中的信息,而不用担心模板中的文字对象被意外修改。   ” 文本变量的语法 文本变量以 ${VARIABLENAM
    的头像 发表于 11-13 18:21 170次阅读
    图纸模板中的文本<b class='flag-5'>变量</b>

    Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种。环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时变量方法和
    的头像 发表于 10-23 13:39 160次阅读

    鸿蒙原生应用元服务开发-仓颉基本概念程序结构

    。此外,如果需要获取程序启动时的命令行参数,可以声明和使用 Array 类型参数。 例如在以下程序中,我们在顶层作用定义了全局变量 a 和全局函数 b,还有自定义类型 C、D 和 E,以及作为程序入口
    发表于 08-13 10:57

    can数据帧有哪几个组成

    CAN总线上传输数据的格式。一个典型的CAN数据帧由多个组成,包括帧起始、仲裁、控制、数据、CRC和帧结束。每个
    的头像 发表于 07-24 15:14 987次阅读

    CAN数据帧的各个及其作用

    CAN数据帧由多个组成,包括帧起始、仲裁、控制、数据和帧结束。每个都有其特定的作用
    的头像 发表于 07-24 15:10 1242次阅读

    Win10 vscode中无法编译,提示python.exe: command not found怎么解决?

    电脑中已经删除之前安装的python,环境变量也添加了报错内容中要求的python路径,我用git bash、cmd也是可以打开python的,证明环境
    发表于 06-07 06:42

    什么是智能汽车第六

    在集中式EEA中,博世五大划分最为经典:动力(Power Train)、底盘(Chassis)、车身(Body/Comfort)、座舱
    发表于 04-20 09:46 557次阅读
    什么是智能汽车第六<b class='flag-5'>域</b>?

    鸿蒙TypeScript学习第20天:【模块】

    TypeScript 模块的设计理念是可以更换的组织代码。 模块是在其自身的作用里执行,并不是在全局作用,这意味着定义在模块里面的变量
    的头像 发表于 04-18 15:19 715次阅读
    鸿蒙TypeScript学习第20天:【模块】

    C语言变量应用详解

    变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
    发表于 03-18 11:18 391次阅读
    C语言<b class='flag-5'>变量</b>应用详解

    电阻应变片形变量有多大?电阻应变片能承受的拉应变最大是多少?

    可以通过计算材料的拉伸或压缩来确定。下面将详细介绍电阻应变片的形变量及其计算方法。 首先,我们需要了解一些基本概念。应变是指物体在受到外力作用后发生的形变。在拉伸力作用下,材料会发生横向收缩,使其长度变化;在压
    的头像 发表于 02-04 15:11 1616次阅读

    嵌入式学习-ElfBoard ELF 1板卡-移植python3.6.9

    build-arm目录:elf@ubuntu:~/work/Python-3.6.9$ cd build-arm/(2)设置交叉编译环境变量:elf@ubuntu:~/work/Python
    发表于 01-24 16:50

    自动控制系统中的操纵变量指什么

    操纵变量的定义、作用、分类以及在自动控制系统中的应用。 一、操纵变量的定义 操纵变量是指控制系统中通过控制器进行调节的变量,它是控制系统中的
    的头像 发表于 01-15 11:29 5172次阅读

    ros怎么设置环境变量

    设置ROS环境变量是使用ROS的重要步骤之一。本文将详细介绍如何设置ROS环境变量,包括什么是环境变量、为什么要设置ROS环境变量、如何设置ROS环境
    的头像 发表于 12-28 13:52 2058次阅读