Listede üç nokta […] ne anlama geliyor?


196

Python ile oynuyordum. IDLE aşağıdaki kodu kullandım:

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

Çıktı şuydu:

[1, [...], 2]

Bu […]nedir? İlginçtir, şimdi bunu sonsuza kadar liste listesi listesi olarak kullanabilirim yani

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

Yukarıdakileri istediğim kadar yazabilirim ve hala işe yarardı.

DÜZENLE:

  • Hafızada nasıl temsil edilir?
  • Ne işe yarar? Yararlı olduğu bazı durumlara örnekler yardımcı olacaktır.
  • Resmi belgelere herhangi bir bağlantı gerçekten yararlı olacaktır.

EDIT'in 1. ve 3. liste öğelerine hala cevap arıyor.
Aseem Bansal

7
Daha basit bir örnek olurdu p = [1]; p[0] = p.
arshajii

6
Bence bu bir listede […] (üç nokta) Python'da ne anlama geliyor? , soru (ve cevaplar) bu soruda daha iyi olmasına rağmen.
Martin Thoma

1
Dreampie akıllıdır >>>> p [1: 1] = [p] >>> p 3: [1, <id = 3074777548 ile listede özyineleme>, 2] >>> `kesin detayı verin
Rahul Gautam

@RahulGautam Bunu anlamadı p 3: [1, <Recursion on list with id=3074777548>, 2]. Ne koştun?
Aseem Bansal

Yanıtlar:


112

Bu, kendi içine yerleştirilmiş, yazdırılamayan sonsuz bir liste oluşturduğunuz anlamına gelir. piçeren piçerir p... vb. [...]Notasyonu Bunu biliyorum ve bu temsil edilemeyeceğini bildirmek bildirmek için bir yoldur! Neler olduğunu gösteren güzel bir resim görmek için @ 6502'nin cevabına bir göz atın.

Şimdi, düzenlemenizden sonraki üç yeni öğeyle ilgili olarak:

  • Bu cevap bunu kapsıyor gibi görünüyor
  • Ignacio'nun bağlantısı bazı olası kullanımları açıklıyor
  • Bu, programlama dillerinden daha çok bir veri yapısı tasarımı konusudur, bu nedenle Python'un resmi belgelerinde herhangi bir referans bulunması olası değildir.

Öyleyse infinte bellek alıyor mu? Bunun mümkün olmadığını biliyorum. Nasıl temsil edilir ve ne işe yarar?
Aseem Bansal

21
@Zel: Liste öğeleri referanslardır. İkinci öğe listenin kendisine bir referanstır.
Ignacio Vazquez-Abrams

2
Python onu sonsuz bir referans döngüsü olarak tanımladı, bu yüzden kısa kesmeye karar verdi, gerçekten sonsuz değil. Ve hayır, bir düşünce denemesinin yanı sıra gerçekten kullanışlı değil :)
Óscar López

2
Sonsuz yinelenen yapılar için birkaç kullanım vardır. Ama çok değil.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Bazı örnekler faydalı olabilir.
Aseem Bansal

316

Kodunuzun yarattığı budur

resim açıklamasını buraya girin

İlk ve son öğelerin iki sayıyı (1 ve 2) işaret ettiği ve orta öğenin listenin kendisine işaret ettiği bir liste.

Common Lisp'te dairesel yapıların yazdırılması etkinleştirildiğinde böyle bir nesne şu şekilde yazdırılır:

#1=#(1 #1# 2)

yani #1=üç öğeli bir vektör olan bir nesne (1 ile etiketlenmiş ) vardır, ikincisi nesnenin kendisidir (geri referanslı #1#).

Bunun yerine Python'da yapının dairesel olduğu bilgileri alırsınız [...].

Bu özel durumda açıklama belirsiz değildir (bir listeyi geriye dönük olarak gösterir, ancak yalnızca bir liste vardır, bu yüzden bu liste olmalıdır). Ancak diğer durumlarda belirsiz olabilir ... örneğin

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

geriye doğru referans ya dışa ya da iç listeye işaret edebilir. Aynı şekilde basılan bu iki farklı yapı,

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

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

print(x)
print(y)

ve onlar hafızada

resim açıklamasını buraya girin


Buna [1, [2, [...], 3]]benzer içerikleri bulabilirsiniz : x[1] = [2, [...], 3]ve y[1] = [2, 1, [...]], 3]. Bu, x'in 1 ve sonra tekrarlayan 2s'den oluştuğu, y'nin ise 1s ve 2s arasında değiştiği anlamına gelir.
pascalhein

2
@csharpler: Elbette içeriği analiz ederek ikisini ayırt edebilirsiniz, ancak aynı temsil ile yazdırılırlar. Common Lisp biçiminde yerine onlar olurdu #(1 #1=#(2 #1# 3))için xve #1=#(1 #(2 #1# 3))için y.
6502

5
@BurhanKhalid: ilk için inkscape ve ikinci için gimp (çünkü svg'yi attım)
6502

1
@csharpler: Python'da "sonsuz liste" oluşturamazsınız, çünkü listeler bağlantılı listeler değil gerçekten yeniden boyutlandırılabilir dizilerdir. Bunun yerine Common Lisp'de bir "sonsuz liste" oluşturulabilir #1=(1 . #1#).
6502

1
+ bu şekilde acsii-diagram çizmek istiyorsanız: Asiiflow
Grijesh Chauhan

23

"Kullanımı nedir" sorusuna, işte somut bir örnek.

Grafik azaltma , bir bilgisayar dilini yorumlamak için kullanılan bir değerlendirme stratejisidir. Bu, özellikle işlevsel diller olmak üzere tembel değerlendirme için yaygın bir stratejidir.

Başlangıç ​​noktası, programın atacağı "adımlar" dizisini temsil eden bir grafik oluşturmaktır. Bu programda kullanılan kontrol yapılarına bağlı olarak, bu döngüsel bir grafiğe yol açabilir (çünkü program bir çeşit "sonsuza dek" döngü içerdiğinden veya "derinliği" değerlendirme zamanında bilinecek , ancak grafikte değil ... oluşturma zamanı) ...

Böyle bir grafiği temsil etmek için, fark ettiğiniz gibi sonsuz "veri yapılarına" (bazen özyinelemeli veri yapıları denir ) ihtiyacınız vardır. Genellikle, biraz daha karmaşık olsa.

Bu konuyla ilgileniyorsanız, (diğerlerinin yanı sıra) bu konuda bir ders:
http://underduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf


7

Bunu her zaman nesne yönelimli programlamada yapıyoruz. Herhangi iki nesne birbirine doğrudan veya dolaylı olarak atıfta bulunursa, her ikisi de sonsuz yinelemeli yapılardır (veya ona nasıl baktığınıza bağlı olarak aynı sonsuz yinelemeli yapının her iki parçasıdır). Bu yüzden bunu liste olarak ilkel bir şeyde çok fazla görmüyorsunuz - çünkü kavramı genellikle "sonsuz liste" den ziyade birbirine bağlı "nesneler" olarak tanımlamaktan daha iyidir.

...Sonsuz özyinelemeli bir sözlükle de alabilirsiniz . Bir üçgenin köşelerinin sözlüğünü istediğinizi varsayalım, her bir değer o köşeye bağlı diğer köşelerin sözlüğüdür. Bunu şu şekilde ayarlayabilirsiniz:

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

Yazdırmak Şimdi eğer triangle(ya aya bya cbu konuda), bunu dolu göreceksiniz {...}herhangi iki köşe birbirine geri atıfta çünkü.


Daha basit sözlük örneği:a = {}; a['a'] = a; print a['a']['a']['a']
user650654

Benim için, "..." yerine "<id = ___> ile dikte özyineleme gösterir"
Solomon Ucko

@SolomonUcko Muhtemelen bir şeyleri yazdırmak için otomatik olarak pprint kullanan IPython kullanıyorsunuz . %pprintGüzel yazdırmayı kapatmak için yazarsanız , gösterilecektir ....
nmclean

4

Anladığım kadarıyla, bu sabit noktaya bir örnektir

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

Bunu anlayamadım. Bu komutları çalıştırmayı denedim ama hatalar var.
Aseem Bansal

@Zel: P'nin bildirilmesi için OPs kodunu eklemeniz gerekiyor.
Inkane

1
@Zel: Eh, kendim ne kadar yararlı olduğundan emin değilim, ancak Firegun p (ve dolayısıyla [...] olarak temsil edilen p [1]) f işlevinin bir sabit noktası olduğunu söylüyor. IMHO, bu "[...] nedir?" Sorusunun olası bir cevabıdır. bu durumda.
İnkae

1
Çalışması p = [1]; p[0] = pgereken daha basit bir örneği denedikten sonra bu örneği denedim çünkü aynı hata sorunu vardı f = lambda x:x[0]. Bu bir düzeltme noktasının bir örneğidir, ancak henüz bunun ne kadar yararlı olduğunu bilmeyi başaramadım. Düzeltme noktasının gerçek değeri, ona başka bir noktadan özyinelemeli veya yinelemeli bir şekilde ulaşmaktadır. Y birleştiriciyi oluşturmak için orijinal sorunun liste yapısının nasıl kullanılacağını gösteren bir örnek, mümkünse yardımcı olacaktır.
dansalmo

1
q = lambda: qsonsuza kadar çağrılabilir bir lambda yapar
whackamadoodle3000

-2

Bu özel nesnenin adı Üç Nokta'dır. Sanırım Python intepreter / VM'de tek bir nesne olarak uygulandı - Yok gibi bir şey --- bir çeşit nöbetçi. Gördüğünüz gibi, bu Python'un kendi içindeki bir listenin referansını temsil etmesinin bir yoludur.


Tuhaf bir şekilde, bir Elips nesnesini doğrudan başlatmanın bir yolu yok gibi görünüyor. Ad, örneğin Builtins arabirimi aracılığıyla gösterilmez. Dolayısıyla, belirli bir hatada terime yapılan referansları görebilirsiniz (istisnalar), örneğin bir öğeyi dizin olarak bir üç nokta kullanarak çıkarmaya çalışırsanız. Ama sadece şunu söyleyebilirsiniz: el = Elips () veya bunun gibi bir şey (bulduğum).
Jim Dennis

9
Bunun aslında Elips nesnesiyle ilgisi yoktur. Bir liste yazdırılırken bir döngü algılandığında yazdırılan yalnızca "[...]" değişmez dizesidir. Kodu görün: hg.python.org/cpython/file/84d6c1c0665e/Objects/…
Jeremy Sharpe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.