[譯]python中的global和nonlocal的實踐

vimiix發表於2019-02-22

今天的博文翻譯是關於python中global和nonlocal兩個關鍵字的用法,原文的作者是來自孟加拉國的Tamim Shahriar,他的部落格非常適合新手朋友去閱讀,都是簡短而有意義的python實踐。

我們大多數人都對Python中的全域性變數很熟悉了。如果我們在一個模組中宣告全域性變數,模組內部的任何函式都可以訪問這個全域性變數。(模組可以理解為一個python檔案或.py檔案)

例如下面的程式碼:

x = 5

def myfnc():
	print("inside myfnc", x)
 	def myfnc2():
		print("inside myfnc2", x)
	myfnc2()

myfnc()
複製程式碼

這段程式碼將會輸出:

inside myfnc 5
inside myfnc2 5
複製程式碼

如果我們來改變一下程式碼,就像下面這樣:

x = 5

def myfnc():
	print("inside myfnc", x)
	def myfnc2():
		print("inside myfnc2", x)
		x = 10
		print("x = ", x)

	myfnc2()

myfnc()
複製程式碼

結果會得到如下錯誤:

File "program.py", line 6, in myfnc2
    print("inside myfnc2", x)
UnboundLocalError: local variable `x` referenced before assignment
複製程式碼

在函式myfnc2()中一旦宣告瞭x = 10,Python就會認為x是一個區域性變數(譯者注:此處涉及到python的BGEL變數優先順序原則,可參考此文章瞭解),而在列印函式時,x在宣告之前就使用了它,所有它給出了這個錯誤。因為區域性變數是在編譯時才確定的(來自官方文件:“事實上,區域性變數已經是靜態確定了”)(譯者注:對於這句話沒法直觀的理解,可以繼續參考這篇翻譯)如果將x宣告是全域性的,則可以排除這個錯誤。

x = 5

def myfnc():
	print("inside myfnc", x)
	def myfnc2():
		global x
		print("inside myfnc2", x)
		x = 10
		print("x = ", x)

	myfnc2()

myfnc()
複製程式碼

現在你可以再次執行程式,它就不會丟擲任何錯誤。

如果我們現在這樣寫呢?

x = 5

def myfnc():
	print("inside myfnc", x)
	y = 10
	def myfnc2():
		global x
		print("inside myfnc2", x, y)
		x = 10
		print("x = ", x)

	myfnc2()

myfnc()
複製程式碼

如果你執行該程式,你會看到正確的輸出。但是如果要在myfnc2()中寫入y(例如,指定y = 1之類),則不能使用 global y,因為y不是全域性變數。你不妨試試下面這個失敗的程式碼:

x = 5

def myfnc():
	print("inside myfnc", x)
	y = 10
	def myfnc2():
		global x
		global y
		print("inside myfnc2", x, y)
		x = 10
		print("x = ", x)
		y = 1
		print("y = ", y)

	myfnc2()

myfnc()
複製程式碼

你會得到這個錯誤:NameError: name `y` is not defined

我們需要明白,y不是一個全域性變數。這裡nonlocal就起作用了!僅僅只需寫成nonlocal y來替換global y。它就可以使myfnc2()中的y正常讀寫,呼叫。

x = 5

def myfnc():
	print("inside myfnc", x)
	y = 10
	def myfnc2():
		global x
		nonlocal y
		print("inside myfnc2", x, y)
		x = 10
		print("x = ", x)
		y = 1
		print("y = ", y)

	myfnc2()

myfnc()
複製程式碼

這是我今天學到的東西。 ?

原文連結:love-python.blogspot.com.br/2017/06/glo…

譯文連結:vimiix.com/post/2017/1…

相關文章