python——作用域

简介: python——作用域

作用域

概念

作用域是 Python 程序可以直接访问命名空间的文本区域(代码区域),名称的非限定引用会尝试在命名空间中查找名称,作用域是静态的,命名空间是随着解释器的执行动态产生的,因此在作用域中访问命名空间中的名字具有了动态性,即作用域被静态确定,被动态使用。

种类

Python 有如下四种作用域:

  • 局部:最先被搜索的最内部作用域,包含局部名称。
  • 嵌套:根据嵌套层次由内向外搜索,包含非全局、非局部名称。
  • 全局:倒数第二个被搜索,包含当前模块的全局名称。
  • 内建:最后被搜索,包含内置名称的命名空间。

作用域的搜索顺序通过下图直观的来看一下:

图片.png

Python 中会按上图所示作用域由内向外去搜索名字。

再通过具体代码来对作用域作进一步了解,如下所示:

# 全局作用域
g = 1
def outer():
    # 嵌套作用域
    e = 2
    def inner():
        # 局部作用域
        i = 3

global & nonlocal

我们先来看一下全局变量与局部变量。

  • 全局变量:定义在函数外部的变量。
  • 局部变量:定义在函数内部的变量。

全局变量可以在整个程序范围内进行访问,而局部变量只能在函数内部访问。通过具体示例看一下:

# 全局变量
d = 0
def sub(a, b):
    # d 在这为局部变量
    d = a - b
    print('函数内 : ', d)
sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  0

当内部作用域想要修改外部作用域的变量时,就要用到 globalnonlocal 关键字了,下面通过具体示例来了解一下。

如果我们想将上面示例中 sub() 函数中的 d 变量修改为全局变量,则需使用 global 关键字,示例如下所示:

# 全局变量
d = 0
def sub(a, b):
    # 使用 global 声明 d 为全局变量
    global d
    d = a - b
    print('函数内 : ', d)
sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  8


如果需要修改嵌套作用域中的变量,则需用到 nonlocal 关键字。

不使用 nonlocal

我们先来看一下不使用 nonlocal 关键字的执行情况,如下所示:

def outer():
    d = 1
    def inner():
        d = 2
        print('inner:', d)
    inner()
    print('outer:', d)
outer()

执行结果:

inner:2
outer:1

使用 nonlocal

再来看一下使用了 nonlocal 关键字的执行情况,如下所示:

def outer():
    d = 1
    def inner():
        nonlocal d
        d = 2
        print('inner:', d)
    inner()
    print('outer:', d)
outer()

执行结果:

inner:2
outer:2


相关文章
|
6月前
|
Python
Python新手常见问题三:如何正确理解Python作用域?
在学习Python编程的过程中,理解和掌握作用域(Scope)的概念至关重要。它直接影响到变量的可见性、生命周期以及程序结构的设计。然而,对于许多初学者而言,Python的作用域规则有时可能显得有些神秘和复杂。本文将深入剖析Python作用域的基本原理,并通过实例讲解如何在实际编程中正确应用。
65 1
|
6月前
|
存储 Python 数据处理
Python 05 之函数【参数,返回值,嵌套调用,作用域,匿名函数】
Python 05 之函数【参数,返回值,嵌套调用,作用域,匿名函数】
74 0
|
6月前
|
Python
Python系列(5)—— 作用域
Python系列(5)—— 作用域
|
1月前
|
存储 Python
在Python中,什么是作用域
【10月更文挑战第12天】在Python中,什么是作用域
15 2
|
2月前
|
Python
关于 Python 列表解析式的作用域问题
关于 Python 列表解析式的作用域问题
56 11
|
1月前
|
存储 自然语言处理 Python
解密 Python 的作用域和名字空间
解密 Python 的作用域和名字空间
18 1
|
3月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
34 2
|
3月前
|
Python
深入解析 Python中的命名空间和作用域并举例
【8月更文挑战第15天】Python中的命名空间与作用域是理解变量组织与访问的核心。命名空间是名称到对象的映射,分为全局、局部和内置三种。作用域定义变量的可访问范围,遵循LEGB规则:局部(L)、闭包(E)、全局(G)、内置(B)。示例展示了如何通过`nonlocal`声明跨作用域修改变量。这些机制确保了变量的有效管理和代码的高效执行。
48 0
|
5月前
|
Java Python
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
|
5月前
|
存储 Python
Python教程:深入理解Python中的命名空间和作用域
在 Python 编程中,理解命名空间(Namespace)和作用域(Scope)是至关重要的。它们决定了变量和函数的可见性和访问性,并直接影响代码的结构和行为。本文将深入探讨 Python 3 中命名空间和作用域的概念、规则以及相关的高级主题。
83 4