http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/
http://stackoverflow.com/questions/68645/static-class-variables-in-python
http://www.daniweb.com/software-development/python/threads/33025/static-variables-in-python
python 其中一個特點是他沒有 local static variable. 在這種情況下有很多方式可以實作出來
其中我覺得最簡易也最漂亮的是利用 python 本身的特性, 所有的 function 其實都是一個 object, 既然是 object, 那我存點東西在裡面是很自然的一件事
>>> def counter(): ... if "static" not in dir(counter): ... counter.static = 0 ... else: ... counter.static+= 1 ... return counter.static ... >>> counter() 0 >>> counter() 1 >>> counter.static = 3 >>> counter() 4 >>>
再來是利用 yield
>>> def counter_generator(start): ... def inner(): ... k = start ... while True: ... k += 1 ... yield k ... return inner().next ... >>> counter = counter_generator(100) >>> counter() 101 >>> counter() 102 >>> counter() 103
利用 inner function, 你可以讀取到 outer variable, 不過因為無法直接修改 outer variable, 如果你試著直接去修改, Python 會認為你要修改的 variable 是 local variable, 我們只好把我們要儲存的東西包裝成 dictionary. 然後在 inner function 才能修改成功. 有點麻煩就是了, 聽說在 python 3.0 已解決這個問題, 有一個新的 keyword 叫 'nonlocal' 可以讓你也直接修改 outer variable.
>>> def counter_generator(start): ... x = {"count":start} ... def counter(): ... x["count"] += 1 ... return x["count"] ... return counter ... >>> counter = counter_generator(100) >>> counter() 101 >>> counter() 102 >>> counter() 103
最後當然你也可以利用 Class 來做到 static variable, 不過我覺得有點殺雞用牛刀就是了
沒有留言:
張貼留言