Sharing

2012年7月3日 星期二

Python implement local static variable



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, 不過我覺得有點殺雞用牛刀就是了


沒有留言: