python中的关键字global和nonlocal

知识点:

global将一个变量变为全局变量

nonlocal改变最近的变量,又不是全局作用。

 

1.global

在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local)、嵌套作用域(Encolosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。

m = 1    #全局
def fun1():
    m = 2    #嵌套
    def fun2():
        m = 3    #本地
    fun2()
fun1()

当在函数中给一个变量赋值的时候,python总是创建或者改变本地作用域的变量名,因此你无法在一个函数外调用函数内的变量,也无法在函数内改变一个函数外的变量。就像下面

复制代码
#外层无法引用内层变量
def fun1():
    k = 10
fun1()
print(k)

结果:
Traceback (most recent call last):
  File "I:/untitled/cx/11月/11-17面向对象/1.属性.py", line 83, in <module>
    print(k)
NameError: name 'k' is not defined

#内存无法改变外层变量
k = 100
def fun1():
    k = k + 50
fun1()
print(k)

#结果
Traceback (most recent call last):
...
UnboundLocalError: local variable 'k' referenced before assignment
复制代码

如果在函数中改变函数外的变量或者在函数外调用函数内的变量时,可以使用global。

global可以将一个变量变为全局变量。在内部改变或者在外部引用。

复制代码
def fun1():
    global k
    k = 50
fun1()
print(k)

或者这样
k = 10
def fun1():
    global k
    k = 50
fun1()
print(k)
复制代码

 

 

2.nonlocal

nonlocal可以在一个嵌套的函数中修改嵌套作用域中的变量,理论上是修改离它最近的变量,但不会改变全局。

复制代码
#这是正常情况
def func3():
    n = 1
    def func4():
        n = 2      
        def func5():
            n = 5
            print(n) #5   
        func5()
        print(n)   #2
    func4()
    print(n)   #1
func3()
复制代码

加入nonlocal之后

复制代码
def func3():
    n = 1
    def func4():
        n = 2       #最近的n = 5
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5
    func4()
    print(n)   #1
func3()
复制代码

还可能这样:

复制代码
def func3(): 
    n = 1  #这里最近n =5
    def func4():
        # n = 2       
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5   继承func3
    func4()
    print(n)   #5
func3()
复制代码

不会改变全局

复制代码
n =100
def func3():
    n = 1  #这里最近n =5
    def func4():
        def func5():
            nonlocal n
            n = 5
            print(n) #5
        func5()
        print(n)   #5   继承func3
    func4()
    print(n)   #5
func3()

#结果
5
5
5
100
复制代码

 

posted @   明王不动心  阅读(410)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示