2011-01-05 12 views
-1

私たちはclassとglobalを使用するのではなく、どのようにPythonで静的な効果を構築できますか?Pythonに静的な効果

そのような

ない:

global a 
a = [] 

#simple ex ; 
fonk (a , b , d) 

    x = 1 

    a.append (x) 

EDIT: 私はすなわちFONK機能を終了した場合、私は、一時的な記憶を作成したい、私は一時的にメモリにリストとして変更を保存します。 私たちはデータ型の前にstaticキーワードを置くことしかできませんが、Pythonでは静的なものがありませんので、その効果をPythonで欲しいです。したがって、どうすればいいですか?コード上記のよう

は「」関数の引数のための一時メモリを表し

+7

Eh?静的なクラスのフィールドが必要なように聞こえますか?あなたの「コード」は明確ではありません。 –

+0

「静的効果」とはどういう意味ですか? – miku

+1

コードが完全にはっきりしているだけでなく、間違っています。 – delnan

答えて

2

デフォルト値は関数定義時に、一度だけ評価されているので、あなたが変更可能なオブジェクトを置けば、それは呼び出しにわたって住むことになる。と言いますちょっとしたことができますが、キャッシュやそれに類するものには非常に便利ですstaticは他の言語でよく使われます。もちろん、呼び出し元はこの場合にキャッシュを無効にできますが、それは悪いことではありません。なぜなら、理由がわからないと、そのような場合には許可しないといけません。

例(この1は通常、代わりに「落とし穴」質問^^中に発見された):

def append_and_return_static_list(item, items=[]): 
    items.append(item) 
    return items 

append_and_return_static_list(0) 
append_and_return_static_list(1) 
print append_and_return_static_list(2) #=> [0,1,2] 

を今、あなたは絶対にその道を行くしたくない場合、あなたはまだ他の可能性を持っている:あなたができます関数の外に変数を作成し、そこで共有したいオブジェクトを配置します。その場所にプライベートであると見なされるようにするには、その名前に単一のアンダースコアを付けるべきです(コンパイラによって強制されるのではなく、従来のやり方で本能的に強制されます)。

例(不最良コード、上記のほぼすべての場合に優れている):モジュールはシングルトンとして、および拡張クラスによって処理されるので、グローバルスコープまたはクラススコープで定義された

_items = [] 
def append_and_return_static_list(item): 
    _items.append(item) 
    return _items 

append_and_return_static_list(0) 
append_and_return_static_list(1) 
print append_and_return_static_list(2) #=> [0,1,2] 
+0

あなたは私にシンプルな元を与えることができますか? –

0

属性を効果的に静的です定義は特定のモジュールグローバルスコープ内のシングルトンです。 (この説明は、この動作を変更するPythonの動的機能を説明しています)

globalキーワードは、割り当てを明確にするためにローカルスコープ内で使用されています。これは、属性名が囲むグローバルスコープに属するという宣言です。

あなたの(壊れた)例では、割り当てを使用していないのでglobalキーワードを使用する必要はありません。 - の曖昧さ回避が必要なappend()メソッドを呼び出しています。

のために使用されているグローバルなものの具体例:

>>> a = [] 
>>> def fonk(): 
...  a = [1] 
... 
>>> print a 
[] 
>>> fonk() 
>>> print a 
[] 
>>> 
>>> def fonk2(): 
...  global a 
...  a = [2] 
... 
>>> print a 
[] 
>>> fonk2() 
>>> print a 
[2] 

EDIT:私は質問のポイントを逃したと思います(グローバルおよびクラス経由でそれをしない)が、私はしないでください例のコードが壊れているように見える場合は、異議を理解してください。