2010-12-04 5 views
5
def a(b=[]): 
    b.append(1) 
    return b 

print a() 
print a() 

突然私は2つのelemsのリストを持っていますが、どうですか?毎回空リストに設定されるべきではありません。関数が定義されたときに助けを求めるpythonのクローズの質問を理解しない

おかげ

+2

はhttp://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argumentも参照してください。 –

答えて

9

少なくとも通常の意味ではなく、クロージャとは関係ありません。

bのデフォルト値は「新しい空のリスト」ではありません。これは、関数を定義しているうちに今作成したばかりのオブジェクトで、空のリストに初期化します。関数が引数なしで呼び出されるたびに、同じオブジェクトが使用されます。

10

デフォルトの引数は一度だけ評価されます。同じオブジェクトがある呼び出しから次の呼び出しまで保持されます。つまり、同じリストが追加され続けることを意味します。 Noneのデフォルト値を使用して、これを回避したい場合は代わりにその値を確認してください。

3

修正版は、他の回答に与えられた理由のために、次のとおりです。関数が定義されている場合

def a(b=None): 
    b = [] if b is None else b 

    b.append(1) 
    return b 
1

デフォルト引数が評価されます(1回)、いないたびに、それが呼び出されます。

はこれを試してみてください。

def a(b=None): 
    if b is None 
     b = []  
    b.append(1) 
    return b 

print a() 
print a()