def func():
def nested():
global x
x = 1
x = 2
func()
print(x)
正確答案是'2',原因是因爲func()沒有定義。但是當我讀到這個時候,似乎func()被定義爲嵌套()。我認爲當你調用func()時會自動調用nested()。我努力去理解這一點,並理解爲什麼我不應該這樣讀。Python基本嵌套語句和作用域概念
def func():
def nested():
global x
x = 1
x = 2
func()
print(x)
正確答案是'2',原因是因爲func()沒有定義。但是當我讀到這個時候,似乎func()被定義爲嵌套()。我認爲當你調用func()時會自動調用nested()。我努力去理解這一點,並理解爲什麼我不應該這樣讀。Python基本嵌套語句和作用域概念
你定義nested
內func
,但你不能在func
調用nested()
任何地方,所以當你調用func()
它有效地無所事事。
做你想要嘗試定義func
作爲什麼:
def func():
def nested():
global x
x = 1
nested()
UPDATE:StevenRumbalski的評論後,我想加入少量的約究竟是怎麼回事該功能可以幫助周圍澄清的事情。
Python的函數本身是可以響應操作符()
的對象。 當你定義一個新的函數時,你實際上在做的是實例化一個函數對象並給它一個名字。在上面的例子中,def func()
創建了一個函數實例,並給出了它的名字func,所以當你將運算符()
應用到func時(即當你用func()
調用該函數時),將執行與該名稱關聯的函數的代碼。
現在我們再來看看nested
會發生什麼情況。 嵌套在func的範圍內定義爲,因此當您退出func的範圍時,嵌套的名稱不再定義。 但是,如果您將函數對象返回給func
的調用方,則可以使用該對象運行nested
的代碼。
一個小例子:
def returning_func():
def nested():
print("I am nested!")
return nested # note the lack of the() operator!
在這種情況下,如果我們做
my_reference_to_nested = func()
沒有被印刷,因爲嵌套定義,但不執行。 如果我們調用它,但是:
my_reference_to_nested()
我們執行嵌套的代碼,並打印輸出I am nested!
'nested'被創建*,但不叫* –