リストで省略記号[…]はどういう意味ですか?


196

私はpythonで遊んでいました。IDLEで次のコードを使用しました。

p  = [1, 2]
p[1:1] = [p]
print p

出力は次のとおりです。

[1, [...], 2]

これは何[…]ですか?興味深いことに、これを無限大までのリストのリストのリストとして使用できます。

p[1][1][1]....

上記は、私が望む限り書くことができ、それでも機能します。

編集:

  • それはどのように記憶に表されますか?
  • その用途は何ですか?それが役立ついくつかのケースの例が役立つでしょう。
  • 公式ドキュメントへのリンクがあれば、本当に役に立ちます。

引き続き、EDITの1番目と3番目のリスト要素に対する回答を探しています。
Aseem Bansal 2013年

7
より簡単な例はですp = [1]; p[0] = p
arshajii 2013年

6
これは、Pythonでのリストの[…](省略記号)の意味を複製したものだと思いますか?、ただし、質問(および回答)はこの質問の方が優れています。
Martin Thoma 2013年

1
Dreampie is smart `>>> p [1:1] = [p] >>> p 3:[1、<id = 3074777548>のリストの再帰、2] >>>`正確な詳細を提供
Rahul Gautam

@RahulGautamこれを取得できませんでしたp 3: [1, <Recursion on list with id=3074777548>, 2]。何を走らせたの?
Aseem Bansal

回答:


112

それはあなたがそれ自身の中にネストされた無限のリストを作成したことを意味し、それは印刷することができません。p含む...などpを含みpます。[...]表記は、あなたがこれを知っているために、それは表現できないことを知らせるための方法です!@ 6502の回答を見て、何が起こっているのかを示す良い写真を見てください。

ここで、編集後の3つの新しいアイテムについて:

  • この答えはそれをカバーするようです
  • イグナシオのリンクは、いくつかの可能な用途を説明しています
  • これはプログラミング言語よりもデータ構造設計のトピックであるため、Pythonの公式ドキュメントで参照が見つかることはほとんどありません。

それで、それは無限の記憶を取っていますか?それは不可能だと知っています。それはどのように表され、その用途は何ですか?
Aseem Bansal 2013年

21
@Zel:リスト要素は参照です。2番目の要素は、リスト自体への参照です。
Ignacio Vazquez-Abrams 2013年

2
Pythonはそれを参照の無限ループとして識別したので、それを短くすることに決めました、それは本当に無限ではありません。そして、いいえ、それは思考実験以外にはあまり役に立ちません:)
オスカー・ロペス'06 / 06/18

2
無限の再帰的な構造にはいくつかの用途があります。しかし、多くはありません。
Ignacio Vazquez-Abrams 2013年

@ IgnacioVazquez-Abramsいくつかの例が役立ちます。
Aseem Bansal 2013年

316

これはあなたのコードが作成したものです

ここに画像の説明を入力してください

これは、最初と最後の要素が2つの数値(1と2)を指し、中央の要素がリスト自体を指しているリストです。

Common Lispでは、循環構造の印刷が有効になっている場合、そのようなオブジェクトは次のように印刷されます。

#1=#(1 #1# 2)

つまり、#1=3つの要素を持つベクトルであるオブジェクト(1はでラベル付け)があり、2番目のオブジェクトはオブジェクト自体(で逆参照#1#)です。

代わりにPythonでは、構造がで循環しているという情報を取得するだけです[...]

この特定のケースでは、説明があいまいではありません(リストを後方に指していますが、リストは1つしかないため、そのリストでなければなりません)。他の場合ではあいまいかもしれません...例えば

[1, [2, [...], 3]]

後方参照は、外部リストまたは内部リストを指すことができます。同じ方法で印刷されたこれらの2つの異なる構造は、

x = [1, [2, 3]]
x[1][1:1] = [x[1]]

y = [1, [2, 3]]
y[1][1:1] = [y]

print(x)
print(y)

そして彼らは次のように記憶にあるでしょう

ここに画像の説明を入力してください


次の[1, [2, [...], 3]]ような内容を見つけることができます:x[1] = [2, [...], 3]y[1] = [2, 1, [...]], 3]。つまり、xは1と2の繰り返しで構成され、yは1と2の交互で構成されます。
パスカルライン2013年

2
@csharpler:もちろん、コンテンツを分析することで2つを区別できますが、同じ表現で印刷されます。Common Lispの形式では代わりに、彼らは次のようになります#(1 #1=#(2 #1# 3))のためにx#1=#(1 #(2 #1# 3))のためにy
6502

5
@BurhanKhalid:最初のインクスケープと2番目のギンプ(svgを破棄したため)
6502

1
@csharpler:リストはリンクリストではなく実際にサイズ変更可能な配列であるため、Pythonで「無限リスト」を作成することはできません。Common Lispの「無限リスト」は、代わ​​りにで作成でき#1=(1 . #1#)ます。
6502 2013年

1
+このようにacsii-diagramを描画したい場合:Asiiflow
Grijesh Chauhan

23

「その用途は何か」という質問に対して、具体的な例を示します。

グラフの縮小は、コンピューター言語を解釈するために使用されることがある評価戦略です。これは、特に関数型言語の遅延評価の一般的な戦略です。

開始点は、プログラムが実行する「ステップ」のシーケンスを表すグラフを作成することです。そのプログラムで使用される制御構造に応じて、これはにつながる可能性巡回またはその「深さ」で知られるであろう使用再帰-プログラムは「永遠」のループのいくつかの種類が含まれているため(グラフの評価時間はなくで、graph-作成時間)...

このようなグラフを表すには、気づいたような無限の「データ構造」(再帰的データ構造と呼ばれることもあります)が必要です。通常、少し複雑ですが。

あなたがそのトピックに興味があるなら、ここに(他の多くの中で)その主題に関する講義があります:http :
//undergrad.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf


7

私たちはこれを常にオブジェクト指向プログラミングで行っています。2つのオブジェクトが直接または間接的に相互に参照している場合、それらは両方とも無限再帰構造です(見方によっては、両方とも同じ無限再帰構造の一部です)。これが、リストのようなプリミティブなものではそれほど多く見られない理由です。通常、この概念は「無限リスト」よりも相互に関連する「オブジェクト」として説明する方が得策だからです。

...無限に再帰的な辞書で取得することもできます。三角形の角の辞書が必要だとします。各値は、その角に接続されている他の角の辞書です。次のように設定できます。

a = {}
b = {}
c = {}
triangle = {"a": a, "b": b, "c": c}
a["b"] = b
a["c"] = c
b["a"] = a
b["c"] = c
c["a"] = a
c["b"] = b

印刷するとtriangle(またはaor bまたはcそのことについて)、{...}すべての2つのコーナーが相互に参照し合っているため、いっぱいになっていることがわかります。


より単純な辞書の例:a = {}; a['a'] = a; print a['a']['a']['a']
user650654

私にとっては、「...」の代わりに「<Recursion on dict with id = ___>」が表示されます
Solomon Ucko

@SolomonUckoおそらく、自動的にpprintを使用して印刷するIPythonを使用しています。入力%pprintしてプリティプリントをオフに切り替えると、が表示され...ます。
nmclean 2016

4

私が理解したように、これは固定小数点の例です

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p

これを理解することができませんでした。これらのコマンドを実行しようとしましたが、エラーがあります。
Aseem Bansal 2013年

@Zel:まあ、pが宣言されるように、その前にOPコードを追加する必要があります。
インカネ2013年

1
@Zel:ええと、自分自身がどれほど役に立ったかはわかりませんが、Firegunはp(したがって、[...]として表されるp [1])は関数fの固定点であると述べています。私見、これは「[...]とは何ですか?」という質問の可能な回答です。この場合。
インカネ2013年

1
機能p = [1]; p[0] = pする必要のあるより簡単な例を試した後でこの例を試したため、同じエラーの問題が発生f = lambda x:x[0]しました。これは修正点の例ですが、これがどのように役立つかはまだわかりません。固定点の実際の値は、他の点から再帰的または反復的に到達します。可能であれば、元の質問のリスト構造を使用してYコンビネーターを作成する方法を示す例が役立ちます。
dansalmo 2013年

1
q = lambda: q無限に呼び出し可能なラムダを作成します
whackamadoodle3000

-2

その特別なオブジェクトの名前は省略記号です。私はそれがPythonインタプリタ/ VMのシングルトンオブジェクトとして実装されていると思います-Noneのようなもの-一種のセンチネル。あなたが見てきたように、それはPythonがそれ自体の中でリストの参照を表す方法です。


奇妙なことに、Ellipsisオブジェクトを直接インスタンス化する方法はないようです。たとえば、名前はBuiltinsインターフェースからは公開されません。たとえば、省略記号をインデックスとして使用してアイテムを抽出しようとした場合など、特定のエラー(発生した例外)で用語への参照を確認できます。しかし、あなたはただ言うことができます:el = Ellipsis()またはそのようなもの(私が見つけたもの)。
ジム・デニス

9
これは実際にはEllipsisオブジェクトとは関係ありません。リストの印刷中にサイクルが検出されたときに印刷されるのは、単なるリテラル文字列 "[...]"です。:コードを参照してくださいhg.python.org/cpython/file/84d6c1c0665e/Objects/...
ジェレミー・シャープ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.