2017-03-07 46 views
1
def func(): 
    def nested(): 
     global x 
     x = 1 
x = 2 
func() 
print(x) 

正確答案是'2',原因是因爲func()沒有定義。但是當我讀到這個時候,似乎func()被定義爲嵌套()。我認爲當你調用func()時會自動調用nested()。我努力去理解這一點,並理解爲什麼我不應該這樣讀。Python基本嵌套語句和作用域概念

+2

'nested'被創建*,但不叫* –

回答

4

你定義nestedfunc,但你不能在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!

+0

我看看!所以func()定義了nested(),但實際上並沒有調用它。這就說得通了!非常感謝! – bootoons

+0

很高興它清除了事情;)如果這對你有用,一定要接受答案,以便它被標記爲已解決:) – GPhilo

+0

或'返回嵌套',然後調用'func'作爲'func()()'。或者將'func'稱爲'inner_func = func()'然後'inner_func()',其中'inner_func'最終成爲'nested'的別名。 –