2011-12-20 23 views
1

可能重複:
Read/Write Python Closures如何使內函數看到封閉函數的變量?

在下面的功能,內部功能不修改參數,但只是改變了副本。

def func(): 
    i = 3 
    def inc(i): 
    i = i + 3 
    print i 
    inc(i) 
    inc(i) 
    print i 

func() 

是否有可能避免重複的代碼,並把它放入python函數中?我想下面的太多,但它拋出錯誤​​

def func(): 
    i = 3 
    def inc(): 
    i = i + 3 
    print i 
    inc() 
    inc() 
    print i 

func() 
+0

這是我最喜歡的面試問題之一。我建議你閱讀關於Python中的變量可見性。 – lig

+0

[Read/Write Python Closures](http://stackoverflow.com/q/2009402/395760) – delnan

+0

的可能重複請參閱:http://stackoverflow.com/q/8447947/331473 –

回答

3

在Python 3,你應該這樣做不起作用,因爲變量在外部範圍內,但不是全局的。因此,您需要將該變量作爲參數傳遞。

這是PEP 3104地址的問題。

2

怎麼樣:使用global

def func(): 
    i = 3 
    def inc(): 
    nonlocal i 
    i = i+3 
    print(i) 
    inc() 
    inc() 
    print(i) 

func() 

在蟒蛇2.X:

def func(): 
    i = 3 
    def inc(i): 
     return i + 3 
    print i 
    i = inc(i) 
    i = inc(i) 
    print i 

func() 
0

在Python 3中,您可以使用nonlocal

>>> def func(): 
    i = 3 
    def inc(): 
     nonlocal i 
     i += 3 
    print(i) 
    inc() 
    inc() 
    print(i) 

>>> func() 
3 
9 
>>>