ゼロ基礎学python-16.7 nonlocal紹介

2138 ワード

この章ではnonlocalについてお話しします
1.nonlocalの概要
nonlocalはglobalと似ていますが、ネストされた役割ドメインにのみ作用し、関数にのみ作用します.
>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		nonlocal x
		x=3
		print("test2:"+str(x))
	class a:
		nonlocal x
		x=5
		print("a:"+str(x))
		def a1():
			nonlocal x
			x=7
			print("a.a1:"+str(x))
	test2()
	a.a1()
	print("test:"+str(x))

	
>>> test()
test:1
a:5
test2:3
a.a1:7
test:7

上のコードから前の結論が得られますが、testにはclassがあり、その中のnonlocal xが働いていることに気づくかもしれませんが、逆ではありませんか?
いいえ、最外層がdefなので
より直接的なコードを与えます.
>>> def test():
	x=1
	print("test:"+str(x))
	#def test2():
	#	nonlocal x
	#	x=3
	#	print("test2:"+str(x))
	class a:
		nonlocal x
		x=5
		print("a:"+str(x))
		def a1():
			nonlocal x
			x=7
			print("a.a1:"+str(x))
	#test2()
	a()
	print("test:"+str(x))

	
>>> test()
test:1
a:5
test:5
>>>

私たちは一部のコードを注釈して、しかもaの中のa 1を知らないで、この時私たちは見て、nonlocalも役に立ちます
しかし、注意すべき点は、(globalとnonlocalの違いでもある)
globalはネストされた役割ドメインから実行できますが、nonlocalで宣言された変数はすでに存在する必要があります.そうしないと、エラーが発生します.
>>> def test():
	global x

	
>>> def test():
	nonlocal x
	
SyntaxError: no binding for nonlocal 'x' found
>>>

2.応用
nonlocalは主に外層関数の変数を修正するために使用されます
次のコードを見てください.
>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		#nonlocal x
		x=3
		print("test2:"+str(x))
	test2()
	return x

>>> test()
test:1
test2:3
1
>>>

nonlocalを使わなければxは変わりません
>>> def test():
	x=1
	print("test:"+str(x))
	def test2():
		nonlocal x
		x=3
		print("test2:"+str(x))
	test2()
	return x

>>> test()
test:1
test2:3
3

しかしnonlocal宣言xを用い,xはtest 2実行後,状態が変化した.
まとめ:この章では主にnonlocalとは何かを述べ,nonlocalの簡単な応用についても述べた.
この章はここまでです.ありがとうございました.
------------------------------------------------------------------
クリックしてゼロ基礎学python-ディレクトリをジャンプ
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.