1

こんにちは、私はpythonが初めてです。以下の 2 つのコードがどのように異なる出力を与えるかを誰かが説明できますか? 関数は呼び出されるたびに定義されますか?

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



def f(a, L=None):
     if L is None:
         L = []
     L.append(a)
     return L

実行中

 print f(1)
 print f(2)
 print f(3)

これらの出力をそれぞれ取得します

 [1]
 [1, 2]
 [1, 2, 3]



 [1]
 [2]
 [3]
4

3 に答える 3

2

これは、新しい Python 開発者にとって非常に一般的な「落とし穴」です。最初の例では、関数が 2 番目のパラメーターなしで呼び出されるたびに、新しい空のリストを作成する必要があるように見えます。そうではありません。関数オブジェクトが作成されると、単一のリストが作成されます。これは基本的に、Python スクリプトが読み込まれたとき、または対話型シェルで関数の入力を終了したときです。このリストは、関数の呼び出しごとに使用されるため、累積が表示されます。

2 番目はこれを回避する標準的な方法で、関数が 2 番目のパラメーターなしで呼び出されるたびに新しいリスト インスタンスを作成します。

その裏では、Python は関数定義で見つかったデフォルト値をdefaultsという関数のプロパティに入れています。対話型シェルの呼び出し間で同じインスタンスがどのように存在するかを確認できます。

>>> def f(a,b=[]):
...     b.append(a)
>>> f.__defaults__
([],)
>>> f(1)
>>> f.__defaults__
([1],)
>>> f(2)
>>> f.__defaults__
([1,2],)
于 2013-07-17T14:59:16.797 に答える
0

Python のデフォルト引数は、関数宣言ポイント (インタープリターが最初に見たとき) で評価されます。

最初のスニペットでは、L引数にデフォルトとしてリストが「与えられ」ているため、値が追加されます。

2 番目のスニペットでは、Lは常にNone関数の入り口にあるため、毎回再作成されます。

于 2013-07-17T15:01:47.983 に答える