202

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

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

出力は次のとおりです。

[1, [...], 2]

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

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

上記を好きなだけ書くことができ、それでも機能します。

編集:

  • メモリ上ではどのように表されますか?
  • その用途は何ですか?それが役立ついくつかのケースの例が役に立ちます。
  • 公式ドキュメントへのリンクは非常に役立ちます。
4

5 に答える 5

327

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

ここに画像の説明を入力

これは、最初と最後の要素が 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)

そして、それらは次のように記憶されます

ここに画像の説明を入力

于 2013-06-18T08:00:40.330 に答える
117

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

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

  • この答えはそれをカバーしているようです
  • Ignacio's linkは、いくつかの可能な用途を説明しています
  • これはプログラミング言語よりもデータ構造設計のトピックであるため、Python の公式ドキュメントで参照が見つかる可能性は低いです。
于 2013-06-18T03:40:51.447 に答える
23

「何に使うの?」という質問に対して、具体例を挙げてみます。

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

開始点は、プログラムが実行する一連の「ステップ」を表すグラフを作成することです。そのプログラムで使用されている制御構造によっては、循環グラフが発生する可能性があります (プログラムにある種の「永久」ループが含まれているため、または評価時に「深さ」がわかるがグラフではわからない再帰を使用するため) 。作成時間)...

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

そのトピックに興味がある場合は、(他の多くのトピックの中でも) ここにそのテーマに関する講義があります

于 2013-06-18T07:06:16.187 に答える
8

オブジェクト指向プログラミングでは常にこれを行っています。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そのことについては)、 でいっぱいであることがわかります{...}

于 2013-06-19T04:53:51.410 に答える
3

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

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p
于 2013-06-19T03:15:24.627 に答える