アルゴリズムを実装しようとしているときに、関数を介してPythonリストを変更することができませんでした。この問題を読んだ後、このStackOverflowの回答から[:]
、関数argumemtで渡された配列を変更するために使用することが提案されました。
ただし、次のコードスニペットに示されているように、リストを変更しようとしても問題は解決しませんl
。出力がになることを期待していますがBefore: [1,2,3,4] After: [69, 69, 69, 69]
、代わりにl
以下に示すように元の値に戻ります。
def mutate_list(a, b):
c = [69] * 4
a[:] = c[:2] # changed the elements, but array's still unchanged outside function
b[:] = c[2:]
if __name__ == '__main__':
l = [1, 2, 3, 4]
print("Before: {}" .format(l))
mutate_list(l[:2], l[2:])
print("After: {}" .format(l))
出力:
Before: [1, 2, 3, 4]
After : [1, 2, 3, 4]
なぜこれが起こっているのかについての洞察はありますか?
他の人が指摘しているように、この問題は、関数パラメーターが元の配列のスライスであり、パラメーターが(参照ではなく)値で渡されていたという事実から発生しました。
@Selcukの提案によると、このような操作を行う正しい方法は、元の配列とそのインデックスを関数に渡してから、関数内でスライスを実行することです。
注:この概念は、サブアレイを変更して組み合わせてソリューションを形成する必要がある(再帰的な)分割統治アルゴリズムに役立ちます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加