sec02 - listのコピー(1)
スポンサーリンク

listを別の変数へコピーする

最初に、listのデータを他の変数へ代入する、次のコードを記述して実行結果を確認してみましょう。

original_list = [1, 2, 3]
copied_list = original_list
print(f'original: {original_list}')  # [1, 2, 3]
print(f'copied: {copied_list}')    # [1, 2, 3] コピー先のlistは元のlistと同じ内容

上記コードは、変数'original_list'に代入されたlistを、変数'copied_list'へコピーしようとしています。print出力した結果は同じように見えます。

それでは次に、コピーされたlistの要素を変更してみましょう。次のようにコードを書いて、実行結果を確認します。

original_list = [1, 2, 3]
copied_list = original_list
copied_list[0] = 99

print(f'original_list: {original_list}')  # [99, 2, 3]  元のlistも変更されている
print(f'copied_list: {copied_list}')    # [99, 2, 3]  コピー先のlistも変更されている

実行結果は、元のlistとコピー先のlistの両方が変更されていることを示しています。なぜ、このようなことが起こるのでしょうか? その理由は、次のレクチャーで解説しますので、一旦ここでは解決策の1つを紹介します。

次のコードのように、スライス([:])を使ってコピーを作成します。コードを実行して、結果を確認してみてください。

original_list = [1, 2, 3]
copied_list = original_list[:]
copied_list[0] = 99

print(f'original_list: {original_list}')  # [1, 2, 3]  元のlistは変更されていない
print(f'copied_list: {copied_list}')    # [99, 2, 3]  コピー先のlistは変更されている

上記コードを実行すると、元のlistは変更されず、コピー先のlistのみが変更されていることが確認できます。スライスを使うと、Pythonはオリジナルのlistの内容を、指定した範囲で抽出して新規にlistを作成します。そのため、元のlistとコピー先のlistは別々のデータとなり、片方を変更してももう片方には影響を与えなくなります。

ネストされたlistを別の変数へコピーする

次に、ネストされたlistのコピーについても確認してみましょう。

original_list = [[1, 2], 3, 4]
copied_list = original_list[:]
copied_list[0] = 99

print(f'original_list: {original_list}')  # [[1, 2], 3, 4]  元のlistは変更されていない
print(f'copied_list: {copied_list}')    # [99, 3, 4]  コピー先のlistは変更されている

上記コードは、ネストされたlistをスライスでコピーしています。ネストになっている要素([0])の値を変更しても、元のlistには影響がなさそうです。

それでは次に、要素番号[0]のlist([1, 2])の中の要素を変更してみましょう。次のコードを実行して、結果を確認します。

original_list = [[1, 2], 3, 4]
copied_list = original_list[:]
copied_list[0][0] = 99

print(f'original_list: {original_list}')  # [[99, 2], 3, 4]  元のlistも変更されている
print(f'copied_list: {copied_list}')    # [[99, 2], 3, 4]  コピー先のlistも変更されている

ネストされているlistの中の要素([0][0])を変更すると、元のlistも変更されてしまいます。

今のままだと、copied_listの中の要素を変更すると、元のlistにも影響が出てしまう不具合がまだ残っています。これを解決するには、Pythonがどのように変数とデータを管理しているかを理解する必要があります。次のレクチャーでは、Pythonの変数とデータの管理方法について詳しく解説します。

スポンサーリンク