Python関数の可変デフォルトパラメータ(list,set,dict...)のトラップに注意してください...

1298 ワード

テキストリンク:https://yq.aliyun.com/articles/693140
ほとんどの場合、Pythonは清潔で一貫性のある言語です.しかし、初心者を困惑させることは少ない.中には意識的だが潜在的なわけがわからず、言語の贅肉と言える場合もある.次に、可変デフォルトパラメータ(Mutable default arguments)を使用すると、何が起こるかを見てみましょう.
デフォルトのパラメータがlistである関数を書いたかもしれません.
def append_to(element, to=[]):
    to.append(element)
    return to

次に、関数を呼び出します.
my_list = append_to(12)
print(my_list)

my_other_list = append_to(42)
print(my_other_list)
A new list is created each time the function is called if a second argument isn’t provided, so that the output is:

この関数を呼び出すたびに、2番目のパラメータが指定されていない場合(デフォルトのパラメータを使用)、新しいlistが生成されるので、出力は次のようになります.
[12]
[42]

しかし、結果は上記ではなく、次のようになります.
[12]
[12, 42]

この関数が定義されると、デフォルトパラメータとしてリストが一度に生成され、その後、正常に呼び出されるたびに最初に生成されたリストが使用されます.
Pythonのデフォルトパラメータは、呼び出すたびに生成されるのではなく、関数が定義されたときにのみ生成されます.これは、可変デフォルトパラメータを使用して変更すると、関数を呼び出す結果がすべてこの可変オブジェクトになることを意味します.
正しい方法は次のとおりです.
デフォルトのパラメータをNone(Noneは通常良い選択)にし、呼び出すたびに新しいオブジェクトを作成します.
def append_to(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to

また、関数でappend操作が行われているため、listオブジェクトを2番目のパラメータとして渡すことにも注意してください.
文章は私の個人ブログ:www.yuanrenxue.com微信公衆番号:猿人学Python