蟒靜態變量是否有可能用Python語言編寫一個函數,該函數的參數a和打印h的結果+ a其中h是一個局部變量。然後它應該返回自己,h增加1。模擬帶密封蓋
模擬帶密封蓋
回答
是的,你可以
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
證明完畢
這不會增加局部變量。你只是模擬海報想要的東西。 –
在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
返回(並返回本身)取的說法,但是這是一個微不足道的變化。)
爲什麼這與h = [1]一起工作,但不與h = 1一起工作? – Moe
基本上,在python3之前,如果你試圖在inner()中賦值*賦值h,那麼「h」被認爲是inner()的本地屬性。所以你有兩個選擇:(一)分配然後使用。然後,inner()中的h會影響f()中的h,並且它不會保留在調用中,而這不是您想要的。 (b)使用然後分配。但是因爲它被認爲是內在的,所以在分配它之前不能使用它 - 它還沒有被綁定。有了h = [1],你在內部做的所有事情都在使用它---你指的是它,但你從來沒有分配給* h本身*。你只需分配給h [0]。 –
- 1. 斯卡拉:帶密封蓋
- 2. 模擬(Moq)或覆蓋密封類中的只讀操作?
- 3. 虛擬,覆蓋,新和密封覆蓋之間的區別
- 4. TypeMock如何模擬密封類和非虛擬方法?
- 5. 模擬數據包封裝
- 6. 如何擺脫虛擬表?密封類
- 7. 密封違規:包oracle.net.ns是密封的
- 8. 模擬AJAX延遲與包裝封閉
- 9. 模擬阿賈克斯被封鎖
- 10. 虛擬信封
- 11. 模擬輸入密鑰java
- 12. 帶風格模擬的DrawGlyphRun?
- 13. 密封類性能
- 14. Kotlin:Upcast和密封類
- 15. 擴展密封類
- 16. 摘要密封類
- 17. 密封部分類
- 18. java.lang.SecurityException:密封違規:
- 19. 緊密封裝類
- 20. 是否有免費的嘲笑框架可以模擬非虛擬,靜態或密封的方法和類?
- 21. 設計諮詢 - 當使用「虛擬」和「密封」有效
- 22. C#方法是默認密封還是虛擬的?
- 23. 在Android模擬器上模擬320 dpi的密度
- 24. 休眠搜索..訪問未密封的密封工作隊列
- 25. 波紋模擬器GPS未被覆蓋
- 26. 覆蓋默認的模擬屬性值
- 27. 量角器覆蓋「beforeAll」http模擬
- 28. 如何覆蓋@Produces使用模擬
- 29. 覆蓋XMLHttpRequest並模擬響應
- 30. 凍結模擬的財產被覆蓋
是的,這是可能的 – donkopotamus
但是,爲什麼?你應該改變標題以強調學習關閉 - 否則你可能會得到很多人告訴你'模擬靜態變量是浪費時間 - python已經擁有了它們!「另外,它們不被稱爲靜態變量蟒蛇。 –
我只是好奇,如果這是可能的,因爲我無法創建我自己的解決方案。我不確定如何標題。 – Moe