浅析Python中作用域的应用

 更新时间:2023年08月30日 08:44:29   作者:python收藏家  
这篇文章主要是想和大家一起来讨论下去Python中的命名空间、作用域和LEGB规则等不同概念,文中的示例代码简洁易懂,快跟随小编一起来学习一下吧

什么是Python中的命名空间

python命名空间是一个容器,其中名称映射到对象,它们用于避免在不同命名空间中存在相同名称的情况下发生混淆。它们由模块、函数、类等创建。

Python中的作用域是什么

作用域定义了必须搜索名称空间以获得名称到对象(变量)的映射的层次顺序。它是一个上下文,变量存在于其中,并从其中引用它们。它定义了变量的可访问性和生存期。让我们举一个简单的例子,如下所示:

pi = 'outer pi variable'
def print_pi():
    pi = 'inner pi variable'
    print(pi)
print_pi()
print(pi)

输出

inner pi variable
outer pi variable

上面的程序给出了不同的输出,因为相同的变量名pi驻留在不同的命名空间中,一个在函数print_pi中,另一个在上层。当print_pi()被执行时,'inner pi variable’被打印为函数命名空间内的pi值。当pi在外部命名空间中被引用时,输出值“outer pi variable”。从上面的例子中,我们可以猜测,在决定从哪个命名空间中选择变量时,肯定有一个遵循的规则。

Python中的作用域LEGB规则

在Python中,LEGB规则用于决定搜索命名空间以进行作用域解析的顺序。以下按层次结构列出了范围(从最高到最低/从最窄到最宽):

  • Local(L):定义在函数/类内部
  • Enclosed(E):定义在封闭函数内(嵌套函数概念)
  • Global(G):定义在全局(最上层)中
  • Built-in(B):Python内置模块中的保留名称

Python中的局部作用域

局部作用域引用当前函数中定义的变量。函数总是会首先在其局部作用域中查找变量名。只有当它在那里没有找到它时,才检查外部范围。

# Local Scope
pi = 'global pi variable'
def inner():
    pi = 'inner pi variable'
    print(pi)
inner()

输出

inner pi variable

在运行上面的程序时,内部函数的执行打印其局部(LEGB规则中的最高优先级)变量pi的值,因为它在局部作用域中定义并可用。

局部和全局作用域

如果一个变量没有在局部范围中定义,则在更高的范围中检查它,在本例中是全局范围。

# Global Scope
pi = 'global pi variable'
def inner():
    pi = 'inner pi variable'
    print(pi)
inner()
print(pi)

输出

inner pi variable
global pi variable

因此,正如预期的那样,程序在执行inner()时打印出局部作用域中的值。这是因为它是在函数内部定义的,这是变量被查找的第一个地方。全局范围内的pi值在第8行执行print(pi)时打印。

局部、封闭和全局作用域

对于封闭的作用域,我们需要定义一个包含内部函数的外部函数,注释掉内部函数的局部pi变量,并使用nonlocal关键字引用pi。

# Enclosed Scope
pi = 'global pi variable'
def outer():
    pi = 'outer pi variable'
    def inner():
        # pi = 'inner pi variable'
        nonlocal pi
        print(pi)
    inner()
outer()
print(pi)

输出

outer pi variable
global pi variable

当outer()被执行时,inner()和相应的print函数被执行,它们打印所包含的pi变量的值。第10行的语句在inner的局部作用域中查找变量,但在那里找不到它。由于pi是用nonlocal关键字引用的,这意味着pi需要从外部函数(即外部作用域)访问。总而言之,pi变量在局部作用域中找不到,所以要查找更高的作用域。在封闭和全局作用域中都可以找到它。但是根据LEGB层次结构,即使我们在全局范围中定义了一个变量,也会考虑封闭的范围变量。

局部、封闭、全局和内置作用域

最后的检查可以通过从math模块导入pi并注释全局、封闭和局部pi变量来完成,如下所示:

# Built-in Scope
from math import pi
# pi = 'global pi variable'
def outer():
    # pi = 'outer pi variable'
    def inner():
        # pi = 'inner pi variable'
        print(pi)
    inner()
outer()

输出

3.141592653589793

由于pi没有在局部、封闭或全局作用域中定义,因此会查找内置作用域,即从数学模块导入的pi值。所以程序能够在最外层范围内找到pi的值。

到此这篇关于浅析Python中作用域的应用的文章就介绍到这了,更多相关Python作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现简单的2048小游戏

    Python实现简单的2048小游戏

    这篇文章主要为大家详细介绍了Python实现简单的2048小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Python如何实现FTP功能

    Python如何实现FTP功能

    在本篇文章里小编给大家整理的是关于Python实现的简易FTP的实例内容,有兴趣的朋友们可以参考下。
    2020-05-05
  • 关于Python的高级数据结构与算法

    关于Python的高级数据结构与算法

    这篇文章主要介绍了关于Python的高级数据结构与算法,掌握这些数据结构和算法将帮助我们在实际编程中解决各种问题,提高我们的编程技巧和水平,需要的朋友可以参考下
    2023-04-04
  • centos安装python3.10的教程

    centos安装python3.10的教程

    文章主要介绍了在CentOS系统上安装Python 3.10.1的步骤,包括升级OpenSSL到1.1.1,以及详细的操作过程,如切换目录、下载安装包、解压、配置、编译安装、创建软连接和验证等
    2025-03-03
  • Python中encode和encoding的区别小结

    Python中encode和encoding的区别小结

    encode和encoding在Python中虽然都与字符编码相关,但它们的角色和用途是不同的,本文主要介绍了Python中encode和encoding的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python如何定义有可选参数的元类

    Python如何定义有可选参数的元类

    这篇文章主要介绍了Python如何定义有可选参数的元类,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析

    Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析

    读万卷书不如行万里路,学的扎不扎实要通过实战才能看出来,本篇文章手把手带你爬取去哪儿平台的旅游景点攻略并进行可视化分析,大家可以在过程中查缺补漏,看看自己掌握程度怎么样
    2021-10-10
  • Python async+request与async+aiohttp实现异步网络请求探索

    Python async+request与async+aiohttp实现异步网络请求探索

    这篇文章主要介绍了Python async+request与async+aiohttp实现异步网络请求探索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • Python实现批量获取地址的经纬度

    Python实现批量获取地址的经纬度

    在地理分析中,通常需要自己获取经纬度数据,所以本文就来和大家介绍一下如何借助python与地图接口来进行经纬度的爬取,感兴趣的小伙伴可以了解下
    2025-05-05
  • Python闭包的使用方法

    Python闭包的使用方法

    这篇文章主要介绍了Python闭包的使用方法,当返回的内部函数使用了外部函数的变量就形成了闭包,下文更多相关内容需要的小伙伴可以参考一下
    2022-04-04

最新评论