質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

12620閲覧

なぜPythonでは配列をリストと呼ぶのでしょう?

jin_kakei

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3グッド

6クリップ

投稿2018/02/17 00:12

最近 Python を勉強し始めたのですが、"Pythonチュートリアル"を読むと他の言語でいうところの配列らしきものを何の補足もなくリストと呼称していました。どのような思想で配列くらいポピュラーなものについてわざわざ慣習に逆らって別名をつけるのか気になったので、Google先生で軽く調べたのですが、そのことについて言及している記事を見つけられませんでした。

ご存知の方がいらっしゃればご教授いただけると幸いです。

tanat, Lhankor_Mhy, namnium1125👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

配列とリストはデータ構造の違いです。
Pythonには数値データを効率的に表現するためのarrayクラスがありますが、これは次のような性質を持ちます。

  1. 隣り合う要素がメモリ上で連続している
  2. 同じ型の変数しか保持できない

一方で、リストはデータ構造が全然違います。メモリ上で数値が連続している保証はありませんが、C言語の配列と違って、様々な型のオブジェクトを格納できます。この柔軟な機能を実装する方法の一つとしてリストと呼ばれるデータ構造がありました。

このような背景を考えると、リストと配列のどちらも扱うことが出来る言語であるならば、それらを分けて説明するほうが素直なような気がします。

投稿2018/02/17 01:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jin_kakei

2018/02/17 01:46

ご回答いただき、ありがとうございます。 Pythonにもarrayクラスがあることを知りませんでした。勉強不足でお恥ずかしい限りです。 初めてちゃんと勉強した言語がRubyだったため、配列に関する認識に偏りがあったようです。 Rubyの配列はちょっと柔軟過ぎるんでしょうね。
guest

0

なぜPythonでは配列をリストと呼ぶのでしょう?

に対しては、

  • Pythonでは配列をリストと呼びません。
  • Pythonでは配列構造のデータを配列(array)と呼びます。
  • Pythonではリスト構造のデータをリスト(list)と呼びます。

となります。Pythonでは配列(array)もリスト(list)も[0][1]でアクセスできるのでどちらも他の言語の配列の様に見えますが、Pythonの中ではちゃんと区別されています。

投稿2018/02/17 01:47

編集2018/02/17 01:50
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jin_kakei

2018/02/17 01:53

ご回答いただき、ありがとうございます。 dkato0077様の回答でもご指摘を受けましたが、勉強不足でお恥ずかしい限りです。
YouheiSakurai

2018/02/17 01:55

いえいえ。疑問は一つずつ解決すれば良いんだと思います。良い疑問だと思いました。
jin_kakei

2018/02/17 02:01

ありがとうございます。
guest

0

ベストアンサー

どのような型やクラスにどのような言葉をあてるかは言語設計者の自由であり、こうしなければならないという物はありません。ただ、多くの人がわかりやすいようにと言う意図はあるかと思います。

色々調べたのですが、ちゃんとした文献見たいのが見つからなかったので、間違っている所があるかも知れません。


日本語で配列やリストと言われるもの、いわば、あるデータの順序づけられた集合、と言う物に対して、複数の呼び方があります。

  • array (配列)
  • list (リスト、一覧)
  • sequence (シーケンス、順序、連続)
  • vector (ベクトル、方向量) [数学から]
  • tuple (タプル、順序組) [数学から]
  • string (ストリング、紐、(データが文字の場合のみ特に)文字列)

一般英語のみではなく数学用語からの借用もあり、計算機科学の世界で歴史的に使われてきた経緯などによって、だいたい次のように使われています。

なお、順序づけがない場合はcontainer(コンテナ、容器)やset(集合)という言葉が使われます。

array

元々はarray data structure(配列データ構造)の意味で使われていました。つまり、arrayと言った場合はデータ構造そのものを示すと場合があることです。ただ、ここから転じてそのデータ構造で実装されているオブジェクトに対する型やクラスもarrayと呼ぶようになっています。

主な例

そのデータ構造上、その言語における同じ型しか入らない、ということはありません。RubyのC言語実装では全てのオブジェクトがCレベルではVALUEというたった一つの型であり、ArrayはそのVALUEの配列(つまりCでの配列)で実装されていますが、Rubyレベルで見るとVALUEは様々なクラスのオブジェクトなので、Arrayは全てのオブジェクトを混ぜて入れることができます。

list

listはarrayと違ってデータ構造ではなく、順序づけられた集合というものそのものになります。そのため、言語によっては実装によって複数用意されている場合があります。例えばJavaでは、ArrayListLinkedListCopyOnWriteArrayList等です。そして、arrayはlistの一種であるとも言えます。

データ構造によらない配列のような物を示す場合にlistを使います。つまり、上述した配列(array)なのか連結リスト(linked list)なのか、それとも全く別の何かなのかを決め打ちしたくない場合にlistを使うと言うことです。先ほどのJavaではListはインターフェースであって、その具体化クラスであるArrayListLinkedListがわからないとどのような実装なのかはわかりません。

Pythonがlistの名称を使ったのは、実装に対する縛りを入れたくなかったのかも知れませんが、array data structureではないPythonのlist実装があるのかどうかはわかりません。

sequence

listににていますが、集合よりも順序を重視しているというものに使われている印象があります。言語で標準で用意されているのはScalaのSeqぐらいですが、通信などではsequenceという言葉を使うので、その関連で使われる事はあると思います。

vector

listとほぼ一緒ですが、元が数学用語です。

C++にはvectorがありますが、その実装は拡張可能なarray data structureです。元々の配列(array)と区別するためにvectorと別の名称を付けたのだと思われます。JavaのVector(古いJava実装であり、現在は使われる事は無い)はC++の借用と考えられます。

それとは別に、数学用語として採用している物があります。RubyのmatrixライブラリにあるMatrixと一緒に使うVectorは数学でのvectorです。

tuple

順序づけられた組です。1-tuple、2-tupleという表現が英語にはあり、数は固定であることが前提となるようです。2-tupleを別途pairと呼ぶ場合もあります。Pythonのほか、C++やScala等にもあります。

string

元々は「紐」の意味です。転じて連続した物を意味します。そして、いつから、そして、どこからかわかりませんが、文字が連続したものと(つまり、文字列)にたいしてstringと言うようになりました。ほとんどの言語で、文字列はstringの言葉を使っています。古くともCの時にはstringでしたが、いつからそう呼ばれていたのかは不明です。

stream

最後に、配列やリストとは異なる概念として、streamと言う物を紹介しておきます。これまでの物と違い、ただの流れ、順番に取り出せると言うことだけが重視されている物です。これまでの配列などとの違いは、無限を扱えると言うことです。例えば、自然数の列(1から無限に続く数列)はarrayやlistでは表現できません。これららは有限でしか考えていないからです。それを無限までできる(言ってみれば、どこかで止めないと無限ループになる)ように実装しているような物に対して、streamという言葉が使われる事があります。

投稿2018/02/17 05:06

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jin_kakei

2018/02/17 10:47

ご回答いただき、ありがとうございます。 重厚な解説をしていただき、とても勉強になりました。 そもそも配列とは、リストとは何ぞや、というところから入るという発想が足りませんでしたが、それくらい俯瞰で見た方がちゃんとした理解ができるものなんですね。そういう意味でも勉強させていただきました
guest

0

Python のリストは真の可変長配列であり、Lisp スタイルの連結リストではありません。

(ポインタは連番なのね…https://docs.python.org/3/faq/design.html#how-are-lists-implemented)

データの本体はメモリ上に連番ではなくベクトルなどとして使った時のキャッシュ効率を最適化できません。
配列が必要になる場合numpyというライブラリのarrayを使います。

リストについて比較的わかりやすい説明へのリンク。
http://www.laurentluce.com/posts/python-list-implementation/


データ構造の比較が欲しければ。
http://www.geocities.jp/m_hiroi/light/pyalgo02.html


Javascirpt/RubyのArrayは、PythonのListとおなじのようですね。

投稿2018/02/17 02:33

編集2018/02/17 02:57
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jin_kakei

2018/02/17 03:02

ご回答いただき、ありがとうございます。 リンク先を参考に勉強いたします。
退会済みユーザー

退会済みユーザー

2018/02/17 03:28

ポインタ配列への参照を持っているんですか、知りませんでした。
namnium1125

2018/02/17 07:39 編集

私も最初連結リストだと思い込んでいた時期があったのですが違うんですよね… なんていうかその意味でネーミングミスに個人的には感じていますが、そうでもないみたいな話も聞きました。(ソースは忘れましたが。) 「リスト構造」で検索すると連結リストがトップに来るので、Pythonのリストの説明をするときにリスト構造という言葉は避けるべきかもしれませんね。 # 追記 ソース思い出したので貼っておきます。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10183068925
mkgrei

2018/02/17 08:16

確かに連結リストだとインデックスアクセスが時間かかるのでよく考えると不自然でした。
guest

0

違うものだからです。
C 言語で配列と呼ばれているものと全く同じかどうか確かめてください。

投稿2018/02/17 00:25

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/02/17 00:29

質問者ではないのですが、C言語やJavaはともかく、JavaScriptやRubyの配列と何が違うのか、調べてみたけどよくわかりませんでした。
Zuishin

2018/02/17 00:41

命名は言語作成者が自由にしていいと思います。違うものに同じ名前をつけてもいいし、同じものに違う名前をつけてもいいでしょう。 Python が生まれた時点で「配列」と言う言葉が一般に示していたものと全く同じものであれば同じ名前を使ったでしょうが、制作者はそれを越えるものを作ったと思っていたのではないかと想像します。 私が言う「違うもの」と言うのは「Python のリスト」と「JavaScript の配列」が同じ役割を果たして似たような機能を持っているかどうかではなく、「違う言語で独立して開発され独立してメンテナンスされており、そこに互換性は必ずしも必要とされていない」ということです。 互いに影響しあったのかどうかも知りませんが、たまたま似ているだけに過ぎないとも言えるでしょう。
Zuishin

2018/02/17 00:42

つまり Python は配列をリストと呼んでいるのではなく、リストが C の配列の役割を兼ねているという認識です。
maisumakun

2018/02/17 00:45

逆に同じ単語で別な意味、のほうが混乱するのも間違いないですね(PHPの「オーバーロード」とか、Ruby特有のprivate・protectedなど)。
Zuishin

2018/02/17 00:49

確かにそのあたりに罠がありますね。 新しい言語を学ぼうとするときに見慣れた用語が使われていたらつい確認を後回しにして痛い目を見ることがあります。
jin_kakei

2018/02/17 01:37

ご回答いただき、ありがとうございます。 僕の質問がよくなかったのですが、たとえば、CとRubyで共通して配列と呼ばれているデータ型がありますが、両者の機能は全く同じではないと思います。Pythonではあえて配列と呼ばないだけの差別化ができる機能があるのか、ということが知りたかったことです。
Zuishin

2018/02/17 01:44

同じ人が作ったわけではないのでそれぞれに違う命名規則があると言うことが言いたいことでした。その場合に差は無くても構わないわけです。 しかし dkato0077 さんの回答の方が適切だと思いました。
jin_kakei

2018/02/17 02:01

ご回答いただいたのに批判じみたことを書いてしまい、申し訳ありませんでした。 クラスの命名については言語設計者さんの自由だ、ということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問