2011-06-01 225 views
16

我想在嵌套函數定義的嵌套函數被改變的變量,像如何更改嵌套函數的變量在嵌套函數

def nesting(): 
    count = 0 
    def nested(): 
     count += 1 

    for i in range(10): 
     nested() 
    print count 

當嵌套調用函數時,我希望打印10,但會引發UnboundLocalError。全球關鍵詞可以解決這個問題。但由於變量計數只用於嵌套函數的範圍,因此我不希望將其聲明爲全局函數。有什麼好辦法做到這一點?

+1

可能重複(http://stackoverflow.com/questions/7935966/python-overwriting-variables-in-nested-functions) – ikdc 2014-05-15 21:30:51

回答

21

在Python 3.x中,你可以使用nonlocal聲明(在nested)來告訴Python你的意思是分配給count變量nesting

在Python 2.x中,您根本無法從nested分配到中的count。但是,您可以工作圍繞它通過不分配給變量本身,而是利用一個可變容器:

def nesting(): 
    count = [0] 
    def nested(): 
     count[0] += 1 

    for i in range(10): 
     nested() 
    print count[0] 

雖然不平凡的情況下,普通的Python的辦法是包裹在數據和功能類,而不是使用閉包。

+0

你可以做的是從外部函數中綁定閉包內的變量,但不是相反。考慮這種情況下(當父溫控功能範圍已經消失): DEF一個(): 測試= 50 DEF B(y)的: 返回測試+ Y 返回b 運行將返回的功能,增加了50到它的參數。這不會修改測試,並且測試是受約束的。如果你參數化了'a',你可以生成不同的b - 而不是更高階的lisp函數。 – 2011-06-01 09:22:45

+1

Py3K提示+1 – gecco 2013-03-07 15:46:02

4

有點晚,你可以將一個屬性設置爲「嵌套」功能,像這樣:

def nesting(): 

    def nested(): 
     nested.count += 1 
    nested.count = 0 

    for i in range(10): 
     nested() 
    return nested 

c = nesting() 
print(c.count) 
0

對我來說,最簡潔的方法:在兩個版本的Python工程100%。

def ex8(): 
    ex8.var = 'foo' 
    def inner(): 
     ex8.var = 'bar' 
     print 'inside inner, ex8.var is ', ex8.var 
    inner() 
    print 'inside outer function, ex8.var is ', ex8.var 
ex8() 

inside inner, ex8.var is bar 
inside outer function, ex8.var is bar 

更多:http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/

[在嵌套函數的Python覆蓋變量]的