Python では、関数が引数としてリストを受け取ると、パラメーターは事実上、元のリストの場所を指す参照になります。記憶の中で。関数内のリストに加えられた変更は、呼び出しリストに直接反映されます。
ただし、次のコードは、この理解に疑問を呈する独特の動作を示しています。
<code class="python">def function1(list_arg): a = function2() # function2 returns an array of numbers list_arg = list(a) list1 = [0] * 5 function1(list1) print(list1) # [0, 0, 0, 0, 0]</code>
この例では、 function1 が list1 の要素を配列 a の要素と置き換えることによって list1 を変更することを目的としています。しかし、結果は list1 が変更されていないことを示しています。なぜこのようなことが起こるのでしょうか?
この問題は、function1 内の list_arg 変数に新しい値を代入すると元のリストが変更されるという誤った仮定から発生します。実際には、この割り当ては、メモリ内の別のオブジェクトを指すように list_arg の参照を変更するだけです。呼び出しコードによって参照される元のリストは変更されません。
function1 内の元のリストを正常に変更するには、その個々の要素を変更する必要があります。これは、スライス割り当てによって実現できます。
<code class="python">list_arg[:] = list(a)</code>
スライス割り当ては、list_arg 内の要素の範囲全体を list(a) の値に置き換えます。事実上、このアクションは元のリストを直接変更します。
スライス割り当ては便利な解決策ですが、混乱を招く可能性があることに注意することが重要です。リストを適切に変更すると、コードの透明性が低下し、コードを管理している他の開発者による誤解が生じやすくなります。コードの明瞭さと読みやすさを高めるために、関数から変更された新しいリストを返すなどの代替アプローチを検討してください。
以上がPython で関数の引数に新しいリストを代入しても元のリストが変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。