2017-01-21 138 views
0

我想在Python3.4中運行以下代碼,但出現錯誤。如何在函數內部訪問函數中的變量

def checknumner(): 
    i = 0 
    print("checknumber called...") 
    def is_even(): 
     print("is_even called...") 
     global i 
     if i % 2 == 0: 
      print("Even: ", i) 
     else: 
      print("Odd: ", i) 
     i += 1 
    return is_even 

c = checknumner() 
print(c()) 
print(c()) 
print(c()) 

我無法在子函數中訪問變量「i」。

當我註釋掉 「全局I」 statment

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: UnboundLocalError: local variable 'i' referenced before assignment 

當我添加 「全局I」 statment

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: NameError: name 'i' is not defined 

誰能請解釋一下嗎?

回答

3

如果你使用Python 3(和它看起來像你的),有一個驚人的方式來解決這一問題:

def function(): 
    i = 0 
    def another_function(): 
     nonlocal i 
     # use 'i' here 

這裏,i不是全局,因爲它會被定義已經外兩種功能否則。它也不在another_function之內,因爲它在其外部定義。所以,它是非本地

更多信息有關nonlocal

+0

爲什麼'nonlocal'在所有必要的嗎?即使在你的例子中,這只是一個閉包,意味着內函數_has_訪問外函數中定義的變量。 –

+0

編輯:這是導致引用錯誤的'i + = 1'行,但無論如何,即使對於給定的代碼重複調用,'i'也永遠不會增加,'i'仍然可以通過閉包的範圍訪問。 –

+1

@Vincenzzzochi「我」的價值遞增和使用非地方它完美的作品。 – n33rma

相關問題