Bawiłem się w python. Użyłem następującego kodu w IDLE:
p = [1, 2]
p[1:1] = [p]
print p
Wynik był:
[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]....
Mógłbym napisać powyższe tak długo, jak chciałem i nadal by działało.
EDYTOWAĆ:
- Jak jest reprezentowany w pamięci?
- Jakie jest jego zastosowanie? Przydałyby się przykłady niektórych przypadków, w których jest to przydatne.
- Każdy link do oficjalnej dokumentacji byłby naprawdę przydatny.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
źródło
źródło
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. Co prowadziłeś?Odpowiedzi:
Oznacza to, że utworzyłeś nieskończoną listę zagnieżdżoną w sobie, której nie można wydrukować.
p
zawierap
który zawierap
... i tak dalej.[...]
Notacja jest sposobem, aby poinformować to i poinformować, że nie może być reprezentowane! Spójrz na odpowiedź @ 6502, aby zobaczyć ładne zdjęcie pokazujące, co się dzieje.Teraz, odnośnie trzech nowych elementów po twojej edycji:
źródło
To właśnie utworzył Twój kod
Jest to lista, w której pierwszy i ostatni element wskazują dwie liczby (1 i 2), a środkowy element wskazuje samą listę.
W Common Lisp, gdy włączone jest drukowanie struktur okrągłych, taki obiekt byłby drukowany jako
co oznacza, że istnieje obiekt (oznaczony 1 za pomocą
#1=
), który jest wektorem z trzema elementami, drugim jest sam obiekt (z odniesieniem wstecz#1#
).Zamiast tego w Pythonie otrzymujesz informacje, z którymi struktura jest okrągła
[...]
.W tym konkretnym przypadku opis nie jest dwuznaczny (wskazuje do tyłu na listę, ale istnieje tylko jedna lista, więc musi być ta). W innych przypadkach mogą być jednak niejednoznaczne ... na przykład w
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 można utworzyć za pomocą
i będą w pamięci jako
źródło
[1, [2, [...], 3]]
tego:x[1] = [2, [...], 3]
ay[1] = [2, 1, [...]], 3]
. Oznacza to, że x składa się z 1, a następnie powtarzających się 2s, podczas gdy y składa się z naprzemiennych 1s i 2s.#(1 #1=#(2 #1# 3))
zax
i#1=#(1 #(2 #1# 3))
zay
.#1=(1 . #1#)
.Na pytanie „Do czego służy”, oto konkretny przykład.
Redukcja wykresów jest strategią oceny używaną kiedyś do interpretacji języka komputerowego. Jest to powszechna strategia leniwej oceny, zwłaszcza języków funkcjonalnych.
Punktem wyjścia jest zbudowanie wykresu przedstawiającego sekwencję „kroków”, które wykona program. W zależności od struktur kontrolnych używanych w tym programie może to prowadzić do cyklicznego wykresu (ponieważ program zawiera pewnego rodzaju „wieczną” pętlę - lub użyć rekurencji, której „głębokość” będzie znana w czasie oceny , ale nie w grafie czas utworzenia ) ...
Aby przedstawić taki wykres, potrzebujesz nieskończonych „struktur danych” (czasami nazywanych rekurencyjnymi strukturami danych), takich jak te, które zauważyłeś. Zwykle jest to jednak trochę bardziej skomplikowane.
Jeśli jesteś zainteresowany tym tematem, oto (między innymi) wykład na ten temat:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
źródło
Robimy to cały czas w programowaniu obiektowym. Jeśli jakieś dwa obiekty odnoszą się do siebie, bezpośrednio lub pośrednio, oba są strukturami nieskończenie rekurencyjnymi (lub obydwoma częściami tej samej nieskończenie rekurencyjnej struktury, w zależności od tego, jak na to patrzysz). Dlatego nie widzisz tak wiele w czymś tak prymitywnym jak lista - ponieważ zwykle lepiej jest opisywać tę koncepcję jako powiązane ze sobą „obiekty” niż „nieskończoną listę”.
Możesz także uzyskać
...
z nieskończenie rekurencyjnym słownikiem. Załóżmy, że potrzebujesz słownika narożników trójkąta, gdzie każda wartość jest słownikiem innych narożników połączonych z tym narożnikiem. Możesz to skonfigurować w następujący sposób:Teraz, jeśli wydrukować
triangle
(luba
lubb
lubc
dla tej sprawy), zobaczysz, że to pełne{...}
bo jakieś dwa rogi odnosimy się do siebie wzajemnie.źródło
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
aby wyłączyć ładne drukowanie, pojawi się...
.Jak zrozumiałem, jest to przykład punktu stałego
źródło
p = [1]; p[0] = p
przykładu, który musif = lambda x:x[0]
działać. Jest to przykład punktu naprawczego, ale nie byłem jeszcze w stanie zobaczyć, jak wiedza o tym jest przydatna. Rzeczywista wartość punktu stałego dochodzi do niego z innego punktu w sposób rekurencyjny lub iteracyjny. Przykład, który pokazuje, jak użyć struktury listy pierwotnego pytania do utworzenia kombinatora Y, byłby pomocny, jeśli jest to możliwe.q = lambda: q
robi nieskończenie wywoływaną lambdaNazwa tego specjalnego obiektu to Ellipsis. Wydaje mi się, że jest zaimplementowany jako obiekt singletonowy w interpreterie / maszynie wirtualnej Pythona - coś w rodzaju None --- swego rodzaju wartownik. Jak widziałeś, jest to sposób, w jaki Python może reprezentować odwołanie do listy w sobie.
źródło