Saya bermain-main dengan python. Saya menggunakan kode berikut di IDLE:
p = [1, 2]
p[1:1] = [p]
print p
Outputnya adalah:
[1, [...], 2]
Apa ini […]
? Menariknya sekarang saya bisa menggunakan ini sebagai daftar daftar hingga tak terbatas yaitu
p[1][1][1]....
Saya bisa menulis di atas selama yang saya inginkan dan itu masih akan berhasil.
EDIT:
- Bagaimana itu direpresentasikan dalam memori?
- Apa gunanya Contoh beberapa kasus di mana itu berguna akan sangat membantu.
- Tautan apa pun ke dokumentasi resmi akan sangat berguna.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
sumber
sumber
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. Apa yang kamu jalankan?Jawaban:
Ini berarti bahwa Anda membuat daftar tak terbatas yang bersarang di dalam dirinya sendiri, yang tidak dapat dicetak.
p
berisip
yang berisip
... dan sebagainya. The[...]
notasi adalah cara untuk membiarkan Anda tahu ini, dan untuk menginformasikan bahwa hal itu tidak dapat diwakili! Lihatlah jawaban @ 6502 untuk melihat gambar yang bagus menunjukkan apa yang terjadi.Sekarang, mengenai tiga item baru setelah Anda edit:
sumber
Inilah yang kode Anda buat
Ini adalah daftar di mana elemen pertama dan terakhir menunjuk ke dua angka (1 dan 2) dan di mana elemen tengah menunjuk ke daftar itu sendiri.
Dalam Common Lisp ketika mencetak struktur lingkaran diaktifkan, objek seperti itu akan dicetak sebagai
artinya ada suatu objek (berlabel 1 dengan
#1=
) yaitu vektor dengan tiga elemen, yang kedua adalah objek itu sendiri (direferensikan kembali dengan#1#
).Dalam Python, Anda hanya mendapatkan informasi bahwa struktur itu melingkar
[...]
.Dalam kasus khusus ini deskripsinya tidak ambigu (mundur menunjuk ke daftar tetapi hanya ada satu daftar sehingga harus yang satu). Namun dalam kasus lain mungkin ambigu ... misalnya dalam
referensi mundur bisa menunjuk ke luar atau ke daftar dalam. Dua struktur berbeda ini dicetak dengan cara yang sama dapat dibuat dengan
dan mereka akan berada dalam memori sebagai
sumber
[1, [2, [...], 3]]
seperti ini:x[1] = [2, [...], 3]
dany[1] = [2, 1, [...]], 3]
. Ini berarti bahwa x terdiri dari 1 dan mengulangi 2s, sedangkan y terdiri dari 1s dan 2s yang bergantian.#(1 #1=#(2 #1# 3))
untukx
dan#1=#(1 #(2 #1# 3))
untuky
.#1=(1 . #1#)
.Untuk pertanyaan "Apa gunanya", berikut adalah contoh nyata.
Pengurangan grafik adalah strategi evaluasi yang kadang-kadang digunakan untuk menafsirkan bahasa komputer. Ini adalah strategi umum untuk evaluasi malas, terutama bahasa fungsional.
Titik awalnya adalah membuat grafik yang mewakili urutan "langkah" yang akan diambil oleh program. Bergantung pada struktur kontrol yang digunakan dalam program itu, ini mungkin mengarah ke grafik siklik (karena program mengandung semacam loop "selamanya" - atau menggunakan rekursi yang "dalamnya" akan diketahui pada waktu evaluasi , tetapi tidak pada grafik- waktu pembuatan ) ...
Untuk mewakili grafik seperti itu, Anda memerlukan "struktur data" yang tak terbatas (kadang-kadang disebut struktur data rekursif ), seperti yang Anda perhatikan. Biasanya, sedikit lebih rumit.
Jika Anda tertarik dengan topik itu, berikut adalah (di antara banyak lainnya) kuliah tentang hal itu:
http://undergrad.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
sumber
Kami melakukan ini sepanjang waktu dalam pemrograman berorientasi objek. Jika ada dua objek yang merujuk satu sama lain, secara langsung atau tidak langsung, keduanya adalah struktur rekursif tak terbatas (atau keduanya bagian dari struktur rekursif tak terbatas yang sama, tergantung pada bagaimana Anda melihatnya). Itu sebabnya Anda tidak melihat ini dalam sesuatu yang primitif seperti daftar - karena kita biasanya lebih baik menggambarkan konsep sebagai "objek" yang saling berhubungan daripada "daftar tak terbatas".
Anda juga bisa mendapatkan
...
kamus rekursif tanpa batas. Katakanlah Anda menginginkan kamus sudut-sudut segitiga, di mana setiap nilai adalah kamus sudut-sudut lain yang terhubung ke sudut itu. Anda dapat mengaturnya seperti ini:Sekarang jika Anda mencetak
triangle
(ataua
ataub
atauc
dalam hal ini), Anda akan melihat itu penuh{...}
karena setiap dua sudut mengacu ke belakang satu sama lain.sumber
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
untuk mematikan pencetakan yang cukup, itu akan ditampilkan...
.Seperti yang saya mengerti, ini adalah contoh titik tetap
sumber
p = [1]; p[0] = p
contoh sederhana yang perluf = lambda x:x[0]
bekerja. Ini adalah contoh titik perbaikan, tetapi saya belum bisa melihat bagaimana mengetahui ini berguna. Nilai sebenarnya dari titik perbaikan tiba di sana dari titik lain secara rekursif atau berulang. Contoh yang menunjukkan bagaimana menggunakan struktur daftar dari pertanyaan asli untuk membuat kombinator Y akan sangat membantu jika memungkinkan.q = lambda: q
membuat lambda yang tak terbatasNama benda spesial itu adalah Ellipsis. Saya kira itu diimplementasikan sebagai objek tunggal di Python intepreter / VM - sesuatu seperti None --- semacam penjaga. Seperti yang telah Anda lihat, ini merupakan cara bagi Python untuk mewakili referensi daftar di dalam dirinya sendiri.
sumber