Python:global、local与nonlocal变量

python,global,local,nonlocal,变量 · 浏览次数 : 130

小编点评

**程序代码:** ```python import numpy as npn def func(a): b = 1 return a + b print(func(n)) ``` **运行结果:** ``` 3 ``` **解释:** 1. `n` 是一个局部变量,在函数 `func`内被定义和赋值为 1。 2. `b` 是一个全局变量,在函数之外定义和赋值。 3. `func` 中使用了 `global`关键字对 `n` 进行访问,并修改了它的值。 4. 在 `print(func(n))` 中,`n` 是一个局部变量,由于 `func` 在函数外定义,因此无法直接访问全局变量 `n`。 5. `nonlocal` 关键字的作用是为 `n` 创建一个局部变量,并使用 `global`关键字访问全局变量。 6. 在 `print(func(n))` 中,`n` 是一个局部变量,由于 `func` 在函数外定义,因此无法直接访问全局变量 `n`。 **结论:** 该程序展示了局部变量、全局变量和非本地变量的使用场景,以及 `global` 和 `nonlocal`关键字如何用于访问和修改局部变量。

正文

1 local和global变量

先来看一个最简单的Python程序例子:

import numpy as np
n = 2
def func(a):
    b = 1    
    return a + b

print(func(n)) # 3

这里b声明在函数func内,则该变量拥有一个local scope(局部作用域,即在函数内),我们将这类变量称为local(局部)变量。

与之相对的npn这两个变量都在函数之外声明,也即它们都在gobal scope(全局作用域)中,我们将它们global(全局)变量。

如果我们使用IDE在return a+b处打断点并调试,那么可以看到IDE很方便地为我们展示了当前的局部和全局变量(以VSCode为例):

我们在local scope内也可以对global变量进行读取,如下所示:

n = 2
def func(a):
    b = 1    
    return a + b + n # 对全局变量进行读取

print(func(n)) # 5

然而,如果在local scope内对global变量进行修改,比如这样写:

n = 2
def func(a):
    n += 1 # 对全局变量进行修改
    b = 1    
    return a + b + n  
 
print(func(n)) 

运行到n+=1这一语句是就会抛出异常:

UnboundLocalError: local variable 'n' referenced before assignment

此时我们需要用global关键字在局部作用域内声明一个global变量,然后就可以自由修改该变量了:

n = 2
def func(a):
    global n
    n += 1
    b = 1    
    return a + b + n

print(func(n)) # 6

2 nonlocal 变量

最后,我们还要提一种变量,叫nonlocal变量。这种变量常用在局部嵌套函数中将外层函数中的自由变量绑定到内层函数作用域(事实上外层函数中的自由变量对于内层函数来说既也非local也非global,故名nonlocal)。如下列所示:

# outside function 
def outer():
    message = 'local'

    # nested function  
    def inner():

        # declare nonlocal variable
        nonlocal message

        message = 'nonlocal'
        print("inner:", message)

    inner()
    print("outer:", message)

outer()

打印输出:

inner: nonlocal
outer: nonlocal

可以看到,nonlocal的使用将外层函数作用域中的自由变量message和内层函数的作用域进行了绑定。

不过需要注意的是,如果我们使用global关键字来声明变量:

# outside function 
def outer():
    message = 'local'

    # nested function  
    def inner():

        # declare global variable
        global message

        message = 'nonlocal'
        print("inner:", message)

    inner()
    print("outer:", message)

outer()

那么最终的打印输出结果为:

inner: nonlocal
outer: local

这是因为global关键字的使用让我们在inner()函数(局部作用域)内声明了一个global变量,故如果我们在inner()函数内做任何修改,则修改的结果只会在局部作用域(也即outer()函数)之外出现。

此外,nonlocal还可以用来构建如下列所示的闭包函数func(参见我的博客《Python技法4:闭包和保存自由变量 》):

def sample():
    n = 0
    # 闭包函数
    def func():
        nonlocal n
        n += 1
        print("n =", n)
    return func

f = sample()
f() # n = 1
f() # n = 2

这里也是通过nonlocal关键字将自由变量与内层函数绑定,然后再对其进行修改的。

与Python:global、local与nonlocal变量相似的内容:

Python:global、local与nonlocal变量

声明在函数内的变量拥有一个local scope(局部作用域,即在函数内),我们将这类变量称为local(局部)变量。声明在函数之外的变量,也即它们都在gobal scope(全局作用域)中,我们将它们global(全局)变量。nonlocal变量常用在局部嵌套函数中将外层函数中的自由变量绑定到内层函数作用域。

[转帖]eval函数

https://www.cnblogs.com/chenyuting/p/12157711.html eval内置函数 eval是Python的一个内置函数,这个函数的作用是,把字符串当成有效的表达式来求值并返回计算结果。 1 eval(expression[, globals[, locals]]

SICP:求值和环境模型(Python实现)

一个环境就是帧(frame) 的一个序列,每个帧是包含着一些绑定(bindings) 的表格。这些约束将一些变量名字关联于对应的值(在一个帧内,任何变量至多只有一个绑定)。每个帧还包含一个指针,指向这个帧的外围环境(enclosing environment)。如果由于当前讨论的目的,将相应的帧看做是全局(global) 的,那么它将没有外围环境。一个变量相对于某个特定环境的值,也就是在这一环境中

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色的数量,从而降低存储需求。 1.主要原理 (一)颜色聚类(Color Clustering):

核对不同文件夹所含内容的差异并提取缺失内容:Python代码

本文介绍基于Python语言,以一个大文件夹作为标准,对另一个大文件夹所包含的子文件夹或文件加以查漏补缺,并将查漏补缺的结果输出的方法~

Python 引用不确定的函数

本文详细介绍了Python引用不确定的函数的表示方法、如何在Python中引用不确定的函数、如何在Python中调用不确定函数方法。

python 无监督生成模型

本文详细介绍了python 无监督生成模型,主要介绍了无监督生成模型是生成对抗网络(Generative Adversarial Networks, GANs)的方法。

Python 潮流周刊#58:最快运行原型的语言(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2100 字。

10分钟掌握Python缓存

全文速览 python的不同缓存组件的使用场景和使用样例 cachetools的使用 项目背景 代码检查项目,需要存储每一步检查的中间结果,最终把结果汇总并写入文件中 在中间结果的存储中 可以使用context进行上下文的传递,但是整体对代码改动比较大,违背了开闭原则 也可以利用缓存存储,处理完成之

python提取特定格式的数据

Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点。该脚本用于从多个 Excel 文件中提取特定格式的数据并转换为一个新的 Excel 文件。 目录 导入库 Pandas 数据处理 Tkin