web-dev-qa-db-ja.com

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

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

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

出力は次のとおりです。

[1, [...], 2]

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

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

必要な限り上記を書くことができ、それでも動作します。

編集:

  • メモリ内でどのように表されますか?
  • その用途は何ですか?役に立ついくつかのケースの例が役立ちます。
  • 公式ドキュメントへのリンクは本当に便利です。
187
Aseem Bansal

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

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

  • この answer はそれをカバーしているようです
  • Ignacioの link は、いくつかの可能な用途を説明しています
  • これはプログラミング言語よりもデータ構造設計のトピックなので、Pythonの公式ドキュメントで参照が見つかることはまずありません
105
Óscar López

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

enter image description here

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

Common LISPでは、円形構造の印刷が有効な場合、そのようなオブジェクトは次のように印刷されます

#1=#(1 #1# 2)

これは、3つの要素を持つベクトルであるオブジェクト(#1=のラベルが付いた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)

そして彼らは

enter image description here

309
6502

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

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

開始点は、プログラムが実行する一連の「ステップ」を表すグラフを作成することです。そのプログラムで使用される制御構造に応じて、これは巡回グラフにつながる可能性があります(プログラムにはある種の「永久」ループが含まれているため-または、 "深さ"が既知の再帰を使用するため- 評価時間、ただしグラフ作成時間)...

そのようなグラフを表すには、気づいたようなinfinite "data structure"(recursive data structureと呼ばれることもあります)が必要です。ただし、通常はもう少し複雑です。

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

21
Sylvain Leroux

これは常にオブジェクト指向プログラミングで行われます。 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(またはaまたはbまたはcを印刷する場合)は、{...}でいっぱいであることがわかります。任意の2つのコーナーが相互に参照しています。

7
nmclean

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

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