2017-04-06 9 views
0

私はhttps://docs.python.org/3.5/tutorial/controlflow.html#default-argument-valuesを経由していました。私はPythonのドキュメントから理解何ごとに、Python - 関数へのデフォルト引数の変更

[6, 7, 1] 
[4, 5, 2] 
[4, 5, 2, 3] 

今:

x = [4,5] 
def f(a, L=x): 
    L.append(a) 
    return L 

x = [8,9] 
print(f(1,[6,7])) 
print(f(2)) 
print(f(3)) 

私が得た出力だった:私はそこに一例として以下を少し修正

  1. デフォルト値は定義スコープの関数定義のポイントで評価されます。したがって、L = [4,5]

  2. f()の最初の呼び出しの後、L = [6,7,1]。これは問題ありません。

  3. f()の2回目の呼び出し後に出力されないものは出力されます。 Lの値がf()への呼び出しの間で共有される場合、2番目の関数呼び出しの後の出力は[6,7,1,2]でなければなりません。 Lの値は、f()への2回目と3回目の呼び出しで共有されますが、1回目と2回目の呼び出しの間では共有されませんでした。

答えて

0

xfのあなたの引数リストにLのデフォルト値であるとして、あなたはfを呼び出すたびに、それは、L=xを実行するためです。

だから実際にはxに追加されます。

+0

その場合、f()の3番目の呼び出しの出力は[4,5,3]になるはずですか?また、Pyhtonのドキュメントでは、「デフォルト値は1回だけ評価されます」と述べています。 –

0

これは、関数が作成されたときに定義されているようデフォルト値Lが共有されているということを、Lの値が共有されていることはありません。この場合、それは[4, 5]として始まるリストです。

fに電話するときにLに異なる値を指定すると(最初の呼び出しと同じように)、それが使用され、他の呼び出しと共有されません。

Lの値を指定しないと、デフォルト値(期待どおり)が使用されます。これは共有されます。

とにかく、明確でない場合は、変更可能なデフォルト値を使用しないでください。変更可能なデフォルト値を使用して便利に実行できる動作が必要な場合は、手動で行います。たとえコードが少し長くても、より明示的で、予測可能で、読みやすくなります。

関連する問題