Python:变量作用域

变量作用规则

在 Python 中,变量作用,也即变量的查找,遵循 LEGB 规则:
L o c a l → E n c l o s e d → G l o b l a → B u i l t − i n Local\rightarrow Enclosed\rightarrow Globla\rightarrow Built-in LocalEnclosedGloblaBuiltin
其中:

  • Local:局部空间
  • Enclosed:闭包空间
  • Global:代码文件全局空间
  • Built-in:内建空间,最外层

在 Python 中两个变量作用域关键字:

  • global
  • nonlocal

global

如果我们在一个函数中进行这样的操作:

x = 1
def func1():
    x = x + 1 # error
    print(x)

这时将会抛出错误:

Error: reference before assignment

对于全局变量来说,在局部空间内当且仅当可变变量(例如 list)可以修改,不可变变量将会报错,当:

y = []

def func2():
    # 可变类型
    y.append(1)
    print(y) # output [1]

如果希望对不可变变量进行修改,则需要用 global 关键字指定变量空间:

x = 1
def func3():
    global x = x + 1
    print(x) # output 2

nonlocal

nonlocalglobal 类似,但是 global 是直接查找全局变量,而 nonlocal 则是从当前的局部空间往外查找,例如下面的一个嵌套函数:

message = 'global'

def func():
	message = 'nonlocal'
	def func_sub1():
		global message
		print(message)
	def func_sub2():
		nonlocal message
		print(message)
	
	func_sub1()
	func_sub2()

func()

这时输出将会是:

global
nonlocal

可以看到,nonlocal 找到的是嵌套函数外层的变量空间中的 'messsage'

例子

message = 'global'

def TestVariableScope():

	message = 'nonlocal'

	def _local():
		message = 'local'
		print(message)

	def _nonlocal():
		nonlocal message
		print(message)

	def _global():
		global message
		print(message)

	_local()
	_nonlocal()
	_global()
	


def main():
	TestVariableScope()

if __name__ == '__main__':
	main()

输出:

local
nonlocal
global
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值