私はPythonにかなり慣れていないので、以下のコードを使用して取得した結果に頭を悩ませることはできません。
def func(a,b=set()):
res=list()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
print(func([1,1,2,2,3,4]))
print(func([1,1,2,2,3,4]))
私は出力を得ていました:
[1,2,3,4]
[]
「res = list()」の上に「print(b)」を配置すると、次の出力が得られます。
set()
[1,2,3,4]
{1,2,3,4}
[]
何が起こっている?関数を呼び出すときに「b」を「set()」に設定するべきではありませんか?Python3.6を使用しています
デフォルトパラメータのドキュメントをご覧ください。
デフォルト値は1回だけ評価されます。これは、デフォルトがリスト、ディクショナリ、またはほとんどのクラスのインスタンスなどの可変オブジェクトである場合に違いを生みます。
デフォルトのパラメーターを使用して関数を定義する場合、デフォルト値は、定義がインタープリター(実際のdef
ステートメント)によって最初に実行されたときにのみ評価されます。変更可能なデフォルト値が使用されている場合を除いて、これは通常問題ではありません。つまり、その場で変更できるものです。
あなたの場合、b
最初に関数を呼び出したときに関数を変更すると、次回はその値が保持されます。これを回避するには、次のようにします。
def func(a,b=None):
if b is None:
b = set()
res=list()
for i in a:
if i not in b:
res.append(i)
b|={i}
return res
これで、b
常に必要なデフォルト値が得られます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加