
Table of Contents(目次)
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の変数とデータの管理方法について詳しく解説します。