2011-11-17 53 views
1

蟒靜態變量是否有可能用Python語言編寫一個函數,該函數的參數a和打印h的結果+ a其中h是一個局部變量。然後它應該返回自己,h增加1。模擬帶密封蓋

+2

是的,這是可能的 – donkopotamus

+1

但是,爲什麼?你應該改變標題以強調學習關閉 - 否則你可能會得到很多人告訴你'模擬靜態變量是浪費時間 - python已經擁有了它們!「另外,它們不被稱爲靜態變量蟒蛇。 –

+0

我只是好奇,如果這是可能的,因爲我無法創建我自己的解決方案。我不確定如何標題。 – Moe

回答

2

是的,你可以

def f(a): 
    def inner(h, a): 
     print h+a 
     return lambda (x): inner(h+1, x) 
    return inner(1, a) 

例如

g = f(0) # +1 
g = g(0) # +2 
g = g(0) # +3 

f(0) # +1 
g(0) # +4 
g(0) # +4 

打印

1 
2 
3 
1 
4 
4 

證明完畢

+0

這不會增加局部變量。你只是模擬海報想要的東西。 –

3

在Python 3,你可以這樣做:需要

>>> def f(a): 
...  h = 1 
...  def inner(): 
...    nonlocal h 
...    print(a+h) 
...    h += 1 
...    return inner 
...  return inner 
... 
>>> g = f(3) 
>>> g = g() 
4 
>>> g = g() 
5 
>>> g = g() 
6 
>>> g()()() 
7 
8 
9 
<function inner at 0xb71bcd6c> 

以前的版本作假:

>>> def f(a): 
...  h = [1] 
...  def inner(): 
...    print a + h[0] 
...    h[0] += 1 
...    return inner 
...  return inner 
... 
>>> f(3)()()() 
4 
5 
6 
<function inner at 0x10041f050> 
>>> 

(ETA:我想我誤解了問題的一部分,因爲它似乎想要該功能通過f返回(並返回本身)取的說法,但是這是一個微不足道的變化。)

+0

爲什麼這與h = [1]一起工作,但不與h = 1一起工作? – Moe

+2

基本上,在python3之前,如果你試圖在inner()中賦值*賦值h,那麼「h」被認爲是inner()的本地屬性。所以你有兩個選擇:(一)分配然後使用。然後,inner()中的h會影響f()中的h,並且它不會保留在調用中,而這不是您想要的。 (b)使用然後分配。但是因爲它被認爲是內在的,所以在分配它之前不能使用它 - 它還沒有被綁定。有了h = [1],你在內部做的所有事情都在使用它---你指的是它,但你從來沒有分配給* h本身*。你只需分配給h [0]。 –