デフォルト値は関数定義時に、一度だけ評価されているので、あなたが変更可能なオブジェクトを置けば、それは呼び出しにわたって住むことになる。と言いますちょっとしたことができますが、キャッシュやそれに類するものには非常に便利です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]
Eh?静的なクラスのフィールドが必要なように聞こえますか?あなたの「コード」は明確ではありません。 –
「静的効果」とはどういう意味ですか? – miku
コードが完全にはっきりしているだけでなく、間違っています。 – delnan