浅析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使用MD5加密算法对字符串进行加密操作示例

    Python使用MD5加密算法对字符串进行加密操作示例

    这篇文章主要介绍了Python使用MD5加密算法对字符串进行加密操作,结合实例形式分析了Python实现md5加密相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • 用python打包exe应用程序及PyInstaller安装方式

    用python打包exe应用程序及PyInstaller安装方式

    PyInstaller 制作出来的执行文件并不是跨平台的,如果需要为不同平台打包,就要在相应平台上运行PyInstaller进行打包。今天通过本文给大家介绍用python打包exe应用程序及PyInstaller安装方式,感兴趣的朋友一起看看吧
    2021-12-12
  • 详解Python牛顿插值法

    详解Python牛顿插值法

    这篇文章主要介绍了详解Python牛顿插值法,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • 浅谈Tensorflow 动态双向RNN的输出问题

    浅谈Tensorflow 动态双向RNN的输出问题

    今天小编就为大家分享一篇浅谈Tensorflow 动态双向RNN的输出问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python开启摄像头以及深度学习实现目标检测方法

    python开启摄像头以及深度学习实现目标检测方法

    今天小编就为大家分享一篇python开启摄像头以及深度学习实现目标检测方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Python天气语音播报小助手

    Python天气语音播报小助手

    马上就要迎来国庆小长假了,激不激动,兴不兴奋!那今年国庆:天气怎么样?能不能出门逛街?能不能出去旅游?旅游出门就要挑个好的天气!下雨天哪儿哪儿都不舒服。今天小编带大家写一款Python天气语音播报小助手
    2021-09-09
  • 1 行 Python 代码快速实现 FTP 服务器

    1 行 Python 代码快速实现 FTP 服务器

    FTP 服务器,在此之前我都是使用Linux的vsftpd软件包来搭建FTP服务器的,现在发现了利用pyftpdlib可以更加简单的方法即可实现FTP服务器的功能。下面小编给大家带来了1 行 Python 代码快速实现 FTP 服务器,需要的朋友参考下
    2018-01-01
  • 老生常谈python之鸭子类和多态

    老生常谈python之鸭子类和多态

    下面小编就为大家带来一篇老生常谈python之鸭子类和多态。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 在python中路径含有空格的问题及解决

    在python中路径含有空格的问题及解决

    这篇文章主要介绍了在python中路径含有空格的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 在Python中使用Mako模版库的简单教程

    在Python中使用Mako模版库的简单教程

    这篇文章主要介绍了在Python中使用Mako模版库的简单教程,包括在Django或者Tornado框架中集成Mako的方法,需要的朋友可以参考下
    2015-04-04

最新评论