コンラッド・ルドルフの答えのすべてを確実に理解する必要があります。そして、私はあなたの特定のケースでは、それもあなたが望むものだと思います。しかし、多くの場合、より良い方法があります。オブジェクトの変更(つまり、オブジェクトをインプレースで変更する)を回避する場合、2つの名前が同じオブジェクトを参照しているかどうかは重要ではありません。たとえば、次のように変更できます。
hisc.append(5)
これに:
hisc = hisc + [5]
それはその場で変わりませんhisc
。の末尾にが追加された新しいを作成し、list
それ5
をに割り当てhisc
ます。したがって、同じものを指していたという事実はohisc
重要ではありません。それは、指し示すために、変更されずにまだそこにあります。list
hisc
list
ohisc
リストのすべての負の値を0に置き換えたいとしましょう。これは、ミューテーションを使用すると非常に簡単です。
for i in range(len(lst)):
list[i] = max(list[i], 0)
しかし、なしでさらに簡単に:
lst = [max(elem, 0) for elem in lst]
では、すべてのネガティブリスト要素を削除したい場合はどうでしょうか。シーケンスのループ中にシーケンスの形状を変更することはできないため、リストのコピーを作成するか(一方のコピーをループしてもう一方のコピーを変更できるようにする)、またはより複雑なアルゴリズムを考え出す必要があります(たとえば、各0を逆方向に交換してから、最後にあるすべての0を削除します)。しかし、不変に行うのは簡単です。
lst = [elem for elem in lst if elem >= 0]
それで、いつあなたは突然変異したいと思うでしょうか?多くの場合、同じオブジェクトへの2つの参照が必要になるため、一方を更新すると、もう一方に変更が表示されます。その場合、他の人が見るには明らかに実際の変更が必要です。