2011-11-20 30 views
8

Listelerin davranışlarını anlamakta biraz sorun yaşıyorum.Listeye bir değer atama listesi

Benim egzersiz soru: aşağıdaki ifadelerden etkisini gösteren bir bellek modeli çiz:

values = [0, 1, 2] 
values[1] = values 

Benim düşünce bu ifadeleri yürütme olarak bu [0, [0, 1, 2], 3] gibi bir şey listeyi değişeceğini oldu diğer ifadeler ikinci deyim, listedeki ikinci değeri ekleyecektir (1) ancak bu ifadeleri çalıştırdığımda ve sonra Python kabuğundaki (3.2) listeyi yazdırdığımda aşağıdaki sonucu elde ederim:

[0, [...], 2] 

İkinci girdiye bir şey oldu ama tam olarak ne olduğundan emin değilim, birileri neler olduğunu açıklayabilir mi?

, teşekkür ederiz Damian

cevap

13

Yinelemeli bir veri yapısı oluşturdunuz. Listedeki ikinci eleman, listenin kendisine bir referanstır. Bunu yazdığınızda, normalde sorunuzu önerdiğinden, orijinal listeyi ikinci sırada görmeyi beklersiniz.

Ancak, orijinal listenin bir kopyasını ekleme değil gerçek listesine bir referansı takarken. Yani, ikinci eleman bütün listeyi yazdırmalıdır. Ancak, bu ikinci elemanın ikinci unsuru, listenin bir referansıdır, bu yüzden , ikinci elemanını yazdıracaktır, .... Python, [...] görüntüleyerek bunu incelikle kullanır çünkü tek çözüm, sonsuz bir dizi sunmaktır. iç içe geçmiş listeler.

bu şekilde düşünün:

[0, <pointer to itself>, 2] 
:

çıktısı tabii, <pointer to itself>, Of
[0, <pointer to itself>, 2] 

benziyor: values[1] için görevden sonra, liste şöyle görünecek şekilde düşünülebilir birlikte bu koyduğunuzda

elde edersiniz:

[0, [0, <pointer to itself>, 2], 2] 

Ama tabii ki, o da, yazdırılması gerekir içteki <pointer to itself> olduğunu yazdırmak için: vb

[0, [0, [0, <pointer to itself>, 2], 2], 2] 

... vb. Kaplumbağalar tamamen aşağı. sizin için çalışan

+0

Kaplumbağalar için +1 :) –

+0

@Bryan Oakley, cevabınız için teşekkürler, bu harika bir açıklama. Her şey hakkında daha uyanık olması gereken referans/kopyaya kaydım. –

3

Kelimenin tam anlamıyla kendisine bir liste takarken.

values = [0, 1, 2] 
values[1] = values 
# so the list now looks like 
[0, values, 2] 
# so we expand the variable and get 
[0, [0, values, 2], 2] 
# and so on 
[0, [0, [0, values, 2], 2], 2] 
# as this will never end instead Python prints 
[0, [...], 2] 

Yani [...] liste kendisini içerdiği anlamına gelir: biraz bir daire içinde gider çünkü sonuçlanan liste artık basılamaz.

0

biridir: listeleri ve referansları kopyalama Daha fazla bilgi için

values = [0, 1, 2] 
values[1] = values[:] # or list(values) 

here görüyoruz.

+2

Aşağı oylama yapıyorum çünkü bu soruya cevap vermiyor. Soru listede bir listenin bir kopyasını saklamak değil. Soru şu: “Listede bir elementi kendi başına referans olarak belirlediğinizde ne olduğunu açıklayın”. Bu cevap hiçbir açıklama sunmuyor, sadece bir çözüm. Söylediğiniz şey çok yararlı tavsiyeler olsa da, bu soru bağlamında yararlı değildir. –

+1

@Bryan Oakley: Orijinal soruyu cevaplamamasına rağmen, bunu size nasıl yapacağınızı söyleyen tek giriş bu pragmatik yaklaşım için kesinlikle bir hak ediyor. –

İlgili konular