Pythonでは、関数パラメーターが関数呼び出し間で値を維持するのはなぜですか

3月OK

私は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]

編集
0

コメントを追加

0

関連記事

分類Dev

関数Aを呼び出したときに、関数A内の関数Bにパラメーターが渡されるのはなぜですか?

分類Dev

関数を呼び出す前と関数内で、go関数パラメーターのサイズが異なるのはなぜですか?

分類Dev

関数呼び出しにSwiftのパラメーター名が必要なのはなぜですか?

分類Dev

Variantを返す関数を追加のパラメーターで呼び出すことができるのはなぜですか?

分類Dev

settimeout / setintervalでパラメーターを使用して関数を複数回呼び出すことができないのはなぜですか

分類Dev

関数呼び出しにパラメータを持つjavascript関数は可能ですか?

分類Dev

異なる値を渡すにもかかわらず、この関数パラメーターがすべての呼び出しで同一であるのはなぜですか?(ループ内のクロージャの作成)

分類Dev

この関数がパラメーターとして呼び出されない変数に適用されるのはなぜですか?

分類Dev

呼び出す前に、呼び出し可能な関数パラメーターを右辺値にキャストする必要があるのはなぜですか?

分類Dev

異なるパラメーターを持つ継承されたメンバーがある場合、C ++構造体の関数の呼び出しがあいまいになるのはなぜですか?

分類Dev

Kotlinで高階関数の拡張関数パラメーターを通常の関数として呼び出すことができるのはなぜですか?

分類Dev

関数パラメーターが同じ型である場合、Javaで関数呼び出しの両方の引数をキャストするのはなぜ冗長なのですか?

分類Dev

パラメータなしで関数内の関数を呼び出す

分類Dev

コードを関数として呼び出す方が、Clozure Common lispで直接呼び出すよりも時間がかかるのはなぜですか?

分類Dev

関数の呼び出しのパラメータで値を使用する方法は?

分類Dev

関数は、その定義内で異なるパラメーターを使用してそれ自体を呼び出すことができますか?

分類Dev

関数が呼び出されたときにパラメータを正しく渡せないのはなぜですか?

分類Dev

関数のパラメーターに引数なしで関数の呼び出しを解析する-FParsec

分類Dev

Pythonの非同期関数で呼び出されるすべてのパラメーターは何ですか?

分類Dev

クロージャの可変参照パラメータが関数呼び出しよりも長生きしないのはなぜですか?

分類Dev

呼び出された関数のパラメーターは、それを呼び出すものと同じではなく、他の「名前」を持たなければならないのはなぜですか?

分類Dev

メンバー関数からコンストラクターを呼び出そうとすると、IDEが警告を表示するのはなぜですか?

分類Dev

共用体型パラメーターを使用してジェネリック関数を呼び出せないのはなぜですか?

分類Dev

関数呼び出しのパラメーターの前の@は、Pascalで何を意味しますか

分類Dev

この関数を2回呼び出すとエラーが発生するのはなぜですか?

分類Dev

この関数がmoveコンストラクターを呼び出さないのはなぜですか?

分類Dev

匿名のJavaScript関数を関数パラメーターとして宣言するのはなぜですか?

分類Dev

Scalaでは、名前パラメーターによる呼び出しを受け取る関数は、別の関数をパラメーターとして受け取る関数とは異なりますか?

分類Dev

Scalaでは、名前パラメーターによる呼び出しを受け取る関数は、別の関数をパラメーターとして受け取る関数とは異なりますか?

Related 関連記事

  1. 1

    関数Aを呼び出したときに、関数A内の関数Bにパラメーターが渡されるのはなぜですか?

  2. 2

    関数を呼び出す前と関数内で、go関数パラメーターのサイズが異なるのはなぜですか?

  3. 3

    関数呼び出しにSwiftのパラメーター名が必要なのはなぜですか?

  4. 4

    Variantを返す関数を追加のパラメーターで呼び出すことができるのはなぜですか?

  5. 5

    settimeout / setintervalでパラメーターを使用して関数を複数回呼び出すことができないのはなぜですか

  6. 6

    関数呼び出しにパラメータを持つjavascript関数は可能ですか?

  7. 7

    異なる値を渡すにもかかわらず、この関数パラメーターがすべての呼び出しで同一であるのはなぜですか?(ループ内のクロージャの作成)

  8. 8

    この関数がパラメーターとして呼び出されない変数に適用されるのはなぜですか?

  9. 9

    呼び出す前に、呼び出し可能な関数パラメーターを右辺値にキャストする必要があるのはなぜですか?

  10. 10

    異なるパラメーターを持つ継承されたメンバーがある場合、C ++構造体の関数の呼び出しがあいまいになるのはなぜですか?

  11. 11

    Kotlinで高階関数の拡張関数パラメーターを通常の関数として呼び出すことができるのはなぜですか?

  12. 12

    関数パラメーターが同じ型である場合、Javaで関数呼び出しの両方の引数をキャストするのはなぜ冗長なのですか?

  13. 13

    パラメータなしで関数内の関数を呼び出す

  14. 14

    コードを関数として呼び出す方が、Clozure Common lispで直接呼び出すよりも時間がかかるのはなぜですか?

  15. 15

    関数の呼び出しのパラメータで値を使用する方法は?

  16. 16

    関数は、その定義内で異なるパラメーターを使用してそれ自体を呼び出すことができますか?

  17. 17

    関数が呼び出されたときにパラメータを正しく渡せないのはなぜですか?

  18. 18

    関数のパラメーターに引数なしで関数の呼び出しを解析する-FParsec

  19. 19

    Pythonの非同期関数で呼び出されるすべてのパラメーターは何ですか?

  20. 20

    クロージャの可変参照パラメータが関数呼び出しよりも長生きしないのはなぜですか?

  21. 21

    呼び出された関数のパラメーターは、それを呼び出すものと同じではなく、他の「名前」を持たなければならないのはなぜですか?

  22. 22

    メンバー関数からコンストラクターを呼び出そうとすると、IDEが警告を表示するのはなぜですか?

  23. 23

    共用体型パラメーターを使用してジェネリック関数を呼び出せないのはなぜですか?

  24. 24

    関数呼び出しのパラメーターの前の@は、Pascalで何を意味しますか

  25. 25

    この関数を2回呼び出すとエラーが発生するのはなぜですか?

  26. 26

    この関数がmoveコンストラクターを呼び出さないのはなぜですか?

  27. 27

    匿名のJavaScript関数を関数パラメーターとして宣言するのはなぜですか?

  28. 28

    Scalaでは、名前パラメーターによる呼び出しを受け取る関数は、別の関数をパラメーターとして受け取る関数とは異なりますか?

  29. 29

    Scalaでは、名前パラメーターによる呼び出しを受け取る関数は、別の関数をパラメーターとして受け取る関数とは異なりますか?

ホットタグ

アーカイブ