Day4作用域,Python关键字global和nonlocal使用

简介: 作用域,Python关键字global和nonlocal使用

一、概念

作用域是指变量的有效范围。变量并不是在每一个位置都可以访问,访问权限取决于这个变量在哪里赋值,作用域哪个作用域内。在python中的作用域一共分为4种。分别是:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等,最后被搜索。

规则顺序: L –> E –> G –> B

先在局部作用域找,然后在闭包函数外的函数找,然后去全局找,然后去内置找。

def function_1():
    a = '1'
    def function_2():
        print(a)
        print(b)
        print(c)
    function_2()

b = 2
function_1()

上面的代码能够顺利执行,并打印a和b,c报错name 'c' is not defined。我们在function_2中并没有定义a和b两个变量,在上面代码b=2中,b作为了全局变量,属于全局作用域,没有定义在任何一个函数中。在function_1中定义a,这是一个局部变量,属于局部作用域,在function_1外部并不能访问到它,但是对于function_2中,变量a属于嵌套作用,在function_2中可以访问到,变量c属于局部作用域,在function_2之外无法访问。Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些标识符,我们之前用过的inputprintint等都属于内置作用域。

二、全局变量和局部变量

定义在函数内部的变量属于局部作用域,定义在函数之外的属于全局作用域。

局部变量只能在被声明的函数内部访问,全局变量可以在整个程序范围内访问。当我们调用函数时,函数内部的变量会被加入到作用域中。

total = 0
def sum(x,y):
    total = x + y  #这里total是局部变量
    print('函数内total是局部变量,值:',total)
    return  total
sum(1,2)
print('函数外total是全局变量, 值:',total)

输出
函数内total是局部变量,值: 3
函数外total是全局变量, 值: 0

三、global和nonlocal关键字

global:在函数内部声明全局变量,使得函数内部可以访问和修改全局变量的值

还是上述的例子,我们使用global函数使两个total的值相同

total = 0
def sum(x,y):
    global total   #不能直接赋值,需先定义
    total = x + y
    print('函数内total是局部变量,值:',total)
    return  total
sum(1,2)
print('函数外total是全局变量,值:',total)

输出:
函数内total是局部变量,值: 3
函数外total是全局变量, 值: 3

nonlocal:用于在嵌套函数中声明外部嵌套作用域中的变量,使得内部函数可以访问和修改外部函数中的变量。

def outer_function():
    y = 20

    def inner_function():
        y = 1
        print("内部函数 y 的值:", y)

    inner_function()
    print("外部函数 y 的值:", y)

outer_function()

输出:
内部函数 y 的值: 1
外部函数 y 的值: 20
def outer_function():
    y = 20

    def inner_function():
        nonlocal y
        y += 1
        print("内部函数 y 的值:", y)

    inner_function()
    print("外部函数 y 的值:", y)

outer_function()

输出:
内部函数 y 的值: 21
外部函数 y 的值: 21

四、使用场景

1、在函数内部修改全局变量

上面已有

2、在嵌套函数中访问外部函数的变量

上面已有

3、在闭包中使用外部变量

闭包是一种特殊的函数,可以访问其外部作用域中定义的变量。使用 nonlocal 关键字可以在闭包中修改外部变量的值。

def outer():
    x = 10

    def inner():
        nonlocal x
        x += 5
        return x
    return  inner

closure = outer()
print(closure())

输出:15
相关文章
|
2月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
300 1
|
3月前
|
缓存 供应链 监控
1688item_search_factory - 按关键字搜索工厂数据接口深度分析及 Python 实现
item_search_factory接口专为B2B电商供应链优化设计,支持通过关键词精准检索工厂信息,涵盖资质、产能、地理位置等核心数据,助力企业高效开发货源、分析产业集群与评估供应商。
|
3月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
3月前
|
缓存 监控 算法
唯品会item_search - 按关键字搜索 VIP 商品接口深度分析及 Python 实现
唯品会item_search接口支持通过关键词、分类、价格等条件检索商品,广泛应用于电商数据分析、竞品监控与市场调研。结合Python可实现搜索、分析、可视化及数据导出,助力精准决策。
|
3月前
|
JSON 缓存 供应链
电子元件 item_search - 按关键字搜索商品接口深度分析及 Python 实现
本文深入解析电子元件item_search接口的设计逻辑与Python实现,涵盖参数化筛选、技术指标匹配、供应链属性过滤及替代型号推荐等核心功能,助力高效精准的电子元器件搜索与采购决策。
|
3月前
|
缓存 自然语言处理 算法
item_search - Lazada 按关键字搜索商品接口深度分析及 Python 实现
Lazada的item_search接口是关键词搜索商品的核心工具,支持多语言、多站点,可获取商品价格、销量、评分等数据,适用于市场调研与竞品分析。
|
5月前
|
人工智能 JavaScript 前端开发
Python中常见的关键字
Python中常见的关键字是语言内置的特殊单词,具有特定功能,如控制逻辑、定义函数等。关键字不可作为变量名使用,否则会导致语法或类型错误。本文详细介绍了关键字的含义、分类及常见示例,并列举了常见报错原因与解决方法。
246 0
|
5月前
|
存储 人工智能 大数据
Python中的yield关键字
在Python中,`yield`关键字用于创建生成器函数,实现懒惰计算和状态保存。它能逐个生成值,节省内存,适用于处理大数据集或无限序列。通过生成器函数和表达式,可以高效地进行数据过滤与递增序列生成,提高代码效率与可维护性。
432 0
|
10月前
|
人工智能 数据库连接 开发工具
[oeasy]python069_当前作用域都有些什么_列表dir_函数_builtins
本文介绍了Python中`dir()`函数的使用方法及其作用。`dir()`可以列出当前作用域内的所有变量和成员,类似于`locals()`,但`dir()`不仅限于本地变量,还能显示模块中的所有成员。通过`dir(__builtins__)`可以查看内建模块中的所有内建函数,如`print`、`ord`、`chr`等。此外,还回顾了`try-except-finally`结构在数据库连接中的应用,并解释了为何`print`函数可以直接使用而无需导入,因为它位于`__builtins__`模块中。最后,简要提及了删除`__builtins__.print`的方法及其影响。
346 0

推荐镜像

更多