python - global、nonlocal,杂记

本文总结了Python中的全局变量与非局部变量(global和nonlocal)的使用规则。global关键字允许在函数内部访问和修改全局变量,而nonlocal则用于在函数内部修改上一层函数的作用域中的变量。需要注意的是,nonlocal必须在引用变量前声明,并且只能在第二层及以下的函数中使用。未声明或不可修改的变量使用nonlocal会引发错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考tutorial.pdf 9.2 Python 作用域和命名空间

总结:
只有在def一开始就声明的一个变量,他与上次的同名变量没有任何关系,可以随意使用

如果在def中未声明而直接使用一个变量,他会向上寻找,使用第一次遇到的同名变量的数值,不能赋值。只能只读,如果该变量是list,可以执行一些方法的操作。

global和nonlocal,是一种特殊的同步变量名的方式,同样使用前,这层def中不能用过该变量名

nonlocal的上层不能是主体,nonlocal向上追溯直至第一层def,需要有一个独立的变量名,如总结1,如果期间先遇到global 变量,报错

global,可以理解为在主体中声明该变量,如果主题中有了,就同时使用其空间和数值,如果没有,就在主题中没有,就算是在主体中新建了一个未赋值变量,而这层函数和主体同名或新建函数一心同体。只是下层不能用nonlocal调用这个变量

因为过程太长,所以转开一小篇文章存放总结:python - 官方简易文档篇(1)

def a0():
    print(a)
    def a1():
        a=1
        print(a,"a11")
        def a2():
            a=2
            print(a,"a21")
            def a3():
                def a4():
                    nonlocal a
                    a=3
                a4()
            a3()
            print(a,"a22")
        a2()
        print(a,"a12")
    a1()
    print(a)
a=0
a0()
#
0
1 a11
2 a21
3 a22
1 a12
0
def 局部变量测试():
    局部变量="这里是默认的局部变量"
    print(局部变量)
    global 变量1
    print(变量1+",global到了函数里面")
#这里是程序开头
变量1="这里是全局范围定义的变量"
print(变量1)
局部变量测试()
#
这里是全局范围定义的变量
这里是默认的局部变量
这里是全局范围定义的变量,global到了函数里面
def 局部变量测试():
    变量2="testd"
    def 再测试():
        nonlocal 变量2
        变量2="这是什么"
    再测试()
    print(变量2)
变量2="testg"
局部变量测试()
print(变量2)
# 
这是什么
testg
def 局部变量测试():
    变量2="testd"
    def 再测试():
#         def 再再测试():
#             nonlocal 变量2
#             变量2="这是什么"
#         再再测试()
        print(变量2)
        def():
            print(变量2)()
    再测试()
    print(变量2)
变量2="testg"
局部变量测试()
print(变量2)
def d1():
    print(a)
    def d2():
        a="d2"
        print(a)
        def d3():
            nonlocal a
            a="na"
            print(a)
            def d4():
                global a
                print(a)
                def d5():
                    a="bn"
                    print(a,"d5")
                d5()
                a="d4+"
                print(a,"d42")
            d4()
        d3()
        print(a,"d22")
    d2()
    print(a,"d12")
a="a"
print(a)
d1()
print(a)
#
a
a
d2
na
a
bn d5
d4+ d42
na d22
d4+ d12
d4+
def 局部变量测试():
    局部变量="这里是默认的局部变量"
    print(局部变量)
    global 变量1
    变量1="哈哈"
    print(变量1+",global到了函数里面")
#这里是程序开头
局部变量测试()
print(变量1)

这里是默认的局部变量
哈哈,global到了函数里面
哈哈

即便主体没有声明变量,只需要在调用该变量之前,在def中用glocal声明了也可以 的说!

结论:
全局可以看作最外层的明明空间
如果第一层def中设定了同名变量没有赋值,或者没有定义变量,是可以直接调用上一级的改名变量的,上一级没有就上上级,直到遇到该变量,使用其数值,但是这里的使用其数值是只读状态,这层def中,对于该同名变量的赋值是不会影响上级变量的。
如果此时上级变量是个list等可修改组合数据,使用append等原地操作会报错。
nonlocal:非局部,这里可以理解为不止当层def,会追溯到上层变量名,上层没有就报错,上层有的话就同时修改了上层变量的数据!上层有,是指要赋值,没有赋值的变量是无效的。
第一层无法使用nonlocal,同样报错:SyntaxError: no binding for nonlocal ‘a’ found
总结:nonlocal在第二层及更下层的def使用,与上层同名变量同数值。
global,与主体变量名同同心同体。若下层def未命名而直接调用同名变量,也可参照该变量的数值。
nonlocal,影响上层,本层,下层未声明。从第二层def开始使用,上层无该变量或者该变量是global等非上层def原生声明的变量,报错。no binding for nonlocal ‘变量名’ found
global,影响本体,本层,下层未声明。声明前,不得使用该变量。

变量=0
def
	变量:0
	def
		变量:0
		def
			变量=1
			def
				变量:1
				变量=2 #UnboundLocalError: local variable '变量' referenced before assignment
				#如果打算赋值该变量,那就在声明前不要使用
#
变量=[1,2,3]
def
	def
		变量.append(4)
		变量:[1,2,3,4]
#1
def
	变量=0
	def
		def
			nonlocal 变量 #向上追溯变量,直到遇到变量,执行。直到追溯到第一层def。直到遇到global。
			变量=1
		变量:1
	变量:1

#2
def
	def
		nonlocal 变量
#no binding for nonlocal '变量' found

#3
[变量=0] #这个变量不定义也可以,只需要在该主体调用他前,在def中global该变量即可
def
	#变量=1 #SyntaxError: name 'a' is assigned to before global declaration
	global 变量 #全局声明前不要使用该变量
	def
		#nonlocal 变量 #no binding for nonlocal '变量' found 	nonlocal无法调用global的变量
变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值