2011-06-22 9 views
28

可能性の重複:
“Least Astonishment” in Python: The Mutable Default ArgumentオプションのPython関数のパラメータとそのデフォルト値

私は一種の混乱しPython関数/メソッドでどのように機能するかのオプション・パラメータについてです。

I次のコードブロックを持っている:

>>> def F(a, b=[]): 
...  b.append(a) 
...  return b 
... 
>>> F(0) 
[0] 
>>> F(1) 
[0, 1] 
>>> 

なぜF(1)戻り[0, 1]ない[1]

つまり、の内部で何が起こっていますか?

+0

:デフォルトのリストを取得(または辞書を、または設定)するための正しい方法は、関数の内部で、代わりに、実行時にそれを作成することですリストに追加します。 :) – sam

答えて

38

数年前のPyConのGood doc - Default parameter values explained。しかし、基本的に、リストは可変オブジェクトであり、キーワード引数は関数定義時に評価されるので、関数を呼び出すたびに同じデフォルト値が得られます。

これを行うための正しい方法は次のようになります。

def F(a, b=None): 
    if b is None: 
     b = [] 
    b.append(a) 
    return b 
8

Default parametersやや関数オブジェクトのメンバ変数のような、非常に直感的に、です。

デフォルトのパラメータ値は、関数定義の実行時に評価されます。これは、関数が定義されているときに式が1回評価され、各呼び出しで同じ「事前計算された」値が使用されることを意味します。これは、デフォルトのパラメータがリストや辞書などの変更可能なオブジェクトであることを理解するために特に重要です。関数がオブジェクトを変更する場合(たとえば、アイテムをリストに追加するなど)、デフォルト値が実際に変更されます。

http://docs.python.org/reference/compound_stmts.html#function

リストは変更可能なオブジェクトです。その内容を変更することができます。あなただけ追加する前に、bの値を印刷することにより、容易にそれを見ることができます

def good_append(new_item, a_list=None): 
    if a_list is None: 
     a_list = [] 
    a_list.append(new_item) 
    return a_list 
関連する問題