2011-12-20 54 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 
>>>