Co oznaczają elipsy [ ... ] na liście?

Grałem w Pythona. W IDLE użyłem następującego kodu:

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

Wyjście było:

[1, [...], 2]

Co to jest […]? Co ciekawe, mógłbym teraz użyć tego jako listy listy do nieskończoności, tj.

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

Mogłem napisać powyższe tak długo, jak chciałem i nadal będzie działać.

EDIT:

  • Jak to jest reprezentowane w pamięci?
  • jaki jest jego pożytek? Przykładami niektórych przypadków, w których jest to przydatne, są pomocne.
  • jakikolwiek link do oficjalnej dokumentacji byłby bardzo przydatny.
Author: martineau, 2013-06-18

5 answers

Oznacza to, że stworzyłeś nieskończoną listę zagnieżdżoną wewnątrz siebie, której nie można wydrukować. p zawiera p który zawiera p... i tak dalej. Notacja [...] jest sposobem na poinformowanie Cię o tym i poinformowanie, że nie można tego przedstawić! Spójrz na odpowiedź @6502, aby zobaczyć ładne zdjęcie pokazujące, co się dzieje.

Jeśli chodzi o trzy nowe pozycje po edycji:
  • This answer seems to cover it
  • Ignacio ' s link opisuje niektóre możliwe zastosowania
  • Jest to bardziej temat projektowania struktury danych niż języków programowania, więc jest mało prawdopodobne, aby jakiekolwiek odniesienie znalazło się w oficjalnej dokumentacji Pythona.]}
 117
Author: Óscar López,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:21

Oto co stworzył Twój kod

Tutaj wpisz opis obrazka

Jest to lista, w której pierwszy i ostatni element wskazuje na dwie liczby (1 i 2), a środkowy element wskazuje na samą listę.

W Common Lispie, gdy jest włączone drukowanie okrągłych struktur, taki obiekt zostanie wydrukowany jako

#1=#(1 #1# 2)

Co oznacza, że istnieje obiekt (oznaczony jako 1 z #1=), który jest wektorem z trzema elementami, drugim jest sam obiekt (odwołany z #1#).

W Pythonie zamiast tego otrzymujesz informację, że struktura jest okrągła z [...].

W tym konkretnym przypadku opis nie jest niejednoznaczny(jest wstecznie wskazujący na listę, ale jest tylko jedna lista, więc musi nią być). W innych przypadkach może być jednak niejednoznaczna... na przykład w

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

Odniesienie do tyłu może wskazywać na zewnętrzną lub wewnętrzną listę. Te dwie różne struktury wydrukowane w ten sam sposób mogą być tworzone z

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

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

print(x)
print(y)

I będą w pamięci jako

Tutaj wpisz opis obrazka

 322
Author: 6502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 06:17:06

Na pytanie "jaki jest jego pożytek", oto konkretny przykład.

Graph reduction jest strategią ewaluacji używaną w celu interpretacji języka komputerowego. Jest to wspólna strategia leniwej oceny, zwłaszcza języków funkcyjnych.

Punktem wyjścia jest zbudowanie wykresu przedstawiającego sekwencję "kroków", które program podejmie. W zależności od zastosowanych w tym programie struktur sterujących może to prowadzić do wykresu cyklicznego (ponieważ program zawiera jakąś pętlę "na zawsze" - lub używa rekurencji, której" głębokość " będzie znana w czasie ewaluacji , ale nie w czasie tworzenia wykresu )...

Aby przedstawić taki wykres, potrzebujesz nieskończonych "struktur danych" (czasami nazywanych rekurencyjnymi strukturami danych), takich jak ta, którą zauważyłeś. Zwykle jednak trochę bardziej skomplikowane.

Jeśli interesuje Cię ten temat, oto (m.in.) wykład na ten temat przedmiot:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

 23
Author: Sylvain Leroux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 07:20:06

Robimy to cały czas w programowaniu obiektowym. Jeśli dowolne dwa obiekty odnoszą się do siebie, bezpośrednio lub pośrednio, są one zarówno strukturami nieskończenie rekurencyjnymi (lub obie części tej samej nieskończenie rekurencyjnej struktury, w zależności od tego, jak na nią patrzysz). Dlatego nie widzisz tyle w czymś tak prymitywnym jak lista-ponieważ zwykle lepiej opisujemy to pojęcie jako powiązane " obiekty "niż"nieskończoną listę".

Można również uzyskać ... z słownik nieskończenie rekurencyjny. Załóżmy, że chcesz słownik narożników trójkąta, gdzie każda wartość jest słownikiem innych narożników połączonych z tym narożnikiem. Można to ustawić tak:

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

Teraz, jeśli wydrukujesz triangle (lub a lub b lub c, jeśli o to chodzi), zobaczysz, że jest pełna {...}, ponieważ dowolne dwa rogi odnoszą się do siebie.

 8
Author: nmclean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-19 04:53:51

Jak zrozumiałem, jest to przykład punktu stałego

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p
 3
Author: Hanfei Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-19 15:32:32