2009-06-12 20 views
5

ı yerde bu listenin her öğe artırmak istiyorum ben listemiziÖzgün nesnede, kopya için değil, python döngüsünde nasıl çalışırım?

a = [1,2,3] 

olduğunu varsayalım. Ben a hala döndüren döngü [1,2 bitirdim, bu nedenle zaman item sadece değerini değil, onun gerçek referansı kullanır sözdizimsel kolay

for item in a: 
    item += 1 

olarak ama bu örnek Python şey yapmak istiyorum 3] [2,3,4] yerine. Ben

a = map(lambda x:x+1, a) 

gibi bir şey yapabileceğini biliyorum ama bu gerçekten benim şimdiki koduna uymuyor ve bunu yeniden yazmak zorunda kalmak istemem: - \ Burada

+0

For döngüsü, aslında gerçek nesneyi verir, kopyalar değil. Mesele şu ki sayıları kullanıyorsun. Tüm Python değerleri gibi sayılar (ve dizeler), nesnelerdir, ancak her değişmez, benzersiz bir örneğe başvurur. Yani 1'den 2'ye kadar olan bir örneği değiştirebilirseniz, tüm 1'leri 2'lere çevirirsiniz, bu da hangi tür bir emici olur. Her değer için bir örneğe sahip olan seçenek, mümkün olmayacaktır. Id fonksiyonu ile oynamaya çalışın: id (1), id ('merhaba dünya'), vb (her zaman aynı hazır bilgi için aynı adresi döndürür.) – Blixt

cevap

18

ya gitmek:

# Your for loop should be rewritten as follows: 
for index in xrange(len(a)): 
    a[index] += 1 

Tesadüfen, madde a içinde item referansıdır, ancak tabiki tamsayıya yeni bir değer atayamazsınız. Herhangi değişken türü için, kodunuzu sadece iyi çalışacak: Bunun yerine map tabanlı çözümün

>>> a = [[1], [2], [3], [4]] 
>>> for item in a: item += [1] 
>>> a 
[[1,1], [2,1], [3,1], [4,1]] 
+0

Ooooh temizleyin için teşekkürler – spencewah

9

, burada piton tamsayılar bir liste-anlama tabanlı çözüm

a = [item + 1 for item in a] 
12

(ve yüzer ve dizeleri ve tuples) değişmezdir, böylece asıl nesneye sahip olursunuz (ve bir kopya değil), sadece değiştiremezsiniz.

Neler oluyor şu satırda: item += 1 yeni bir tam sayı yaratıyor (item + 1 değeriyle) ve ona item adını bağlıyorsunuz.

Ne yapmak istediğiniz a[index] += 1 hattının neden işlediği a[index] noktasını tamsayı olarak değiştirmektir. Hala yeni bir tamsayı oluşturuyorsunuz, ancak daha sonra listeyi işaret edecek şekilde güncelliyorsunuz. Bir yan not olarak

:

for index,item in enumerate(a): 
    a[index] = item + 1 

... Triptych tarafından gönderildi cevap biraz daha deyimseldir.

+1

Numaralandırmaya başladım ve Şimdi neden değiştiğimi hatırlamıyorum - haha. Sanırım herhangi bir yeni programcının bilmesi muhtemel fonksiyonlara bağlı kalmak istedim, bu yüzden numaradan numaraya geçtim (len()), daha sonra aralık() 'ın sinsi bellek kullanımını teşvik etmek istemediğime karar verdim. xrange() için. En iyi uygulamayı teşvik etmek için iyi bir zaman olduğunda her zaman emin değilim - bazen kullanıcının şu anda anlamaya istekli olduğunu düşünüyorum. – Triptych

+1

@Triptych: Yeni başlayanlar için en temel işlevlere bağlı kalmanın iyi bir fikir olduğunu düşünüyorum, ama xrange'i tanıtmanın önemli olduğuna katılmıyorum.En az sayı kadar tuhaf görünmektedir ve doktorlar, patolojik durumlar haricinde xrange'ın faydasının minimal olduğunu söylemektedir. (Bu benim de deneyimim oldu.) Ve xrange zaten 3.x. –

İlgili konular