Pythonでリストを複製する方法の違いについて、代入による方法とlist()関数による方法の違いとは?

Pythonでリストを複製する方法と、その方法による結果の相違点について説明

今回はPythonのリストを複製(コピー)する方法についての記事です。次の2つの方法による相違点を説明します。

  • 代入文を使う方法: x = y
  • list()関数を使う方法:x = list(イテラブルオブジェクト)

なお正確には代入文を使う方法は「複製」とは呼ばないでしょうが、今回の記事においてはそれも複製を呼ぶようにします。この点はご容赦を。

リストを複製方法と同一性

リストの複製を作る

さっそく上の2つの方法を使ってそれぞれリストの複製(コピー)を作ってみます。


#代入文でオリジナルリストを作成
orgnl_list = [1, 2, 3]

#代入文によってオリジナルリストを複製
copied_by_assgn = orgnl_list

#list()関数(実際には型コンストラクタ)によってオリジナルリストを複製
copied_by_cnst = list(orgnl_list)

オリジナルリストを代入文による方法と、組み込み関数であるlist()を使ったものの2種類の方法で作りました。

厳密にいえば最初の、

orgnl_list = [1, 2, 3]

このorgnl_listも、[1, 2, 3]というリストの複製(複製:上述のように今回の記事での特別な意味としての用語)なのでorgnl(=original)という名前の付け方はおかしいのですが、説明の便宜上許してください。

値の同一性について

次に出来上がった3種類のリストの結果(値)を確認してみましょう。

#結果の確認
orgnl_list == copied_by_assgn == copied_by_cnst #True

これを実行するとTrueとなります。よってどれも同一の結果(値)のリストだとわかりました。

オブジェクトの同一性について

次に、これら3つのオブジェクトの同一性を確認しましょう。オブジェクトの同一性を確認するには比較演算子「is」を使います。

#オブジェクトの同一性確認
copied_by_assgn is orgnl_list  # True
copied_by_cnst is orgnl_list # False

copied_by_assgn is copied_by_cnst  #False

#id確認
id(orgnl_list)  
id(copied_by_assgn) 
id(copied_by_cnst)

これを実行すると、

  • copied_by_assgnとorgnl_listについては、オブジェクトは同一(つまり同じid)
  • copied_by_cnstとornl_listについては、オブジェクトは別もの(つまり別のid)
  • copied_by_cnstとcopied_by_assgnについても、オブエクトは別のもの(つまり別のid)

という結果になりました。

オブジェクトの同一性はオブジェクトのidによって決定されるので、idが同じならば同一のオブジェクトとなります。

元のオブジェクトの変更と複製されたオブジェクトへの影響

では次にオリジナルのリスト(orgnl_list)の中身を変えてみましょう。

# 3番目の要素を文字列Tomへ
orgnl_list[2] = 'Tom'
# 4番目の要素に整数4を追加
orgnl_list.append('4')

この変更の影響が、複製した2つのリストに及ぶのかどうか確かめてみましょう。

# 複製した2つのリストを確認
copied_by_assgn  # 結果:[1, 2, 'Tom', '4']
copied_by_cnst  # 結果:[1, 2, 3]

このように対照的な結果となりました。

代入文によって複製されたcopied_by_assgnには変更点が適応されています。

しかし、上のオブジェクトの同一性で確認したように、copied_by_cnstとorgnl_listは異なるオブジェクトなので、片一方を変更したとしても、もう片方には影響を及ぼしません。

この点が代入文による複製とlist()による複製とでは完全に異なります。

今回のコードの限りでは、list()によって複製された結果できあがったリストオブジェクトは元のリストから独立性を持っていると言えるでしょう。今回のコード限りでは(次の項目に注意)。

注意点

ですが今回の説明には実は注意点があります。それは今回の説明では、最も単純なリストしか作っていないということです。今回使用したリストは、

[1, 2, 3]

というものでした。

このような単純なリストの場合、list()を使って複製した結果できあがったオブジェクトは、元のオブジェクトから独立性を有していました。

しかし、リストには、リストの中の要素そのものがリストである場合も存在します。

たとえば、

[[1, 2, 3], ['Tom', 'Mary', 'Terry'], [x, y, z]]

といったリストですね。

このようなタイプのリストを使う場合は、list()を使ってもちょっと今回の説明とは異なり、元のオブジェクトから完全な独立性を持った結果にはなりません。この点については次回の記事で説明をする予定です。

その次回記事が下のものです。

プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。

など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。

One comment

Comments are closed.