2011-08-10 14 views
7

Python'un bu sözlükte nasıl yinelendiği konusunda kafam karıştı. Pitonun belgelerinden itervalues, sözlük değerleri üzerinden bir yineleyici döndürür.Python'un sözlük yinelemesi niçin bir kopya ile çalışır?

Bu, özgün sözlüğü değiştirilmeden yazdırılır. Neden? Eğer x pozisyonundaki değer "blabla" diyorum, neden ayarlanmıyor?

+0

İyi soru için +1. Beni bir saniye için attı. –

+0

iyi bir soru. – Andy

cevap

7

Bunun dizelerle veya listelerle ilgisi yoktur. Şeytan, for'un nasıl geliştiğini anlatıyor.

for x in d.iteritems(): 
    # loop body 

Doing

biz sadece bir sonuç tutan, x yeniden atama olduğunu görmek çok zor değil bu akılda Yani

iter = d.itervalues() 
while True: 
    try: 
     x = next(iter) 
     # loop body 
    except StopIteration: 
     break 

yapmaya daha çok ya da daha az eşdeğerdir Bir işlev çağrısından.

iter = d.itervalues() 
while True: 
    try: 
     x = next(iter) 

     x = 5 # There is nothing in this line about changing the values of d 
    except StopIteration: 
     break 
+0

Teşekkürler, bu benim için açıklığa kavuşturdu. Python belgelerinin, açıklamaların ve çeşitli yöntemlerin incelikleri gibi şeyleri daha ayrıntılı olarak açıklamasını isterdim. – Justin

5

tek şey

x = x[2:] 

dize dilim x[2:] yaratmak ve bu yeni dize işaret edecek isim x yeniden bağlama olduğunu yapar hattı. Daha önce işaret edilen x dizesini değiştirmez.

for k, v in my_dict.iteritems(): 
    my_dict[k] = v[2:] 
+2

Bunun, değişmez olan dizelerle ilgisi yoktur; eğer "merhaba" yı değiştirirsem: "merhaba" ile "harika": [1,2] 'aynı şekilde çalışır. –

+1

@Mark: Davranışın gerçek sebebini de verdim - dizelerin değişmez olduğu gerçeği bir yan not. Ancak çözümü etkiliyor - değerler listelendiyse, istenen davranışı elde etmek için x için my_dict: del x [: 2] 'yi kullanabilirsiniz. –

+0

@Emil: Yorumunuzu anlamıyorum. Cevabım ile herhangi bir ilgisi var mı? Ya da benim yorumuma? Bu senin düşüşün mü? –

1
: (. Dizeler Python değişmez, bunlar değiştirilemez edilir)

aslında İstediğinizi elde etmek için, dilimleme tarafından oluşturulan yeni dize nesneye sözlük giriş noktası yapmak gerekir

Sven Marnach'un işaret ettiği gibi, dizeler değişmezdir ve yalnızca x'u dilim gösterimi tarafından oluşturulan yeni bir dizgeye yeniden kazandınız. Sen id kullanarak xsözlükte aynı nesneye noktasını yaptığı gösterebilir:

>>> obj = 'hello' 

>>> id(obj) 
<<< 4318531232 

>>> d = {'key': obj} 

>>> [id(v) for v in d.values()] 
<<< [4318531232] 

>>> [id(v) for v in d.itervalues()] 
<<< [4318531232] 

>>> [(k, id(v)) for k, v in d.items()] 
<<< [('key', 4318531232)] 

>>> [(k, id(v)) for k, v in d.iteritems()] 
<<< [('key', 4318531232)] 
Ne istediğini yapmak için bir araya anahtar ve değer tekrarlatacak iteritems kullanabilirsiniz

:

for k,v in dict.iteritems(): 
    dict[k] = v[2:]