0

重複の可能性:
Python の「最小の驚き」: 変更可能な既定の引数

Python 2.7.3 でリストをランダム化する関数を作成しようとしています。それを行うコードは次のとおりです。

import random

def randomize_list(l, new=[]):
    if not len(l):
        return new

    print id(l), id(new)

    l1 = list(l)

    new.append(l1.pop(
        random.choice(list(range(len(l1))))
    ))

    return randomize_list(l1, new)

この関数をインポートして複数回呼び出すと、id(new)は常に同じ値を返し、その後の各randomize_function呼び出しは前の呼び出しの結果に項目を追加します。たとえば、次のようになります。

>>> a = [1,2,3,4]
>>> randomize_list(a)
35192344 35234016
16126176 35234016
16126536 35234016
16126896 35234016
[2,3,4,1]
>>> randomize_list(a)
35192344 35234016
35193488 35234016
35193344 35234016
16126608 35234016
[2,3,4,1,3,2,1,4]
... and so on

なぜこれが起こっているのですか?どうすれば修正できますか?

4

0 に答える 0