SORU
16 Kasım 2010, Salı


Python bile anlama kapsamı sonra anlama bağlamanız isim listesi. Bu doğru mu?

Liste üreteçleri kapsayan bazı beklenmedik etkileşimler. Bu beklenen davranıştır?

Bir yöntem var:

def leave_room(self, uid):
  u = self.user_by_id(uid)
  r = self.rooms[u.rid]

  other_uids = [ouid for ouid in r.users_by_id.keys() if ouid != u.uid]
  other_us = [self.user_by_id(uid) for uid in other_uids]

  r.remove_user(uid) # OOPS! uid has been re-bound by the list comprehension above

  # Interestingly, it's rebound to the last uid in the list, so the error only shows
  # up when len > 1

Sızlanan riskine rağmen, bu hataları acımasız bir kaynaktır. Yeni bir kod yazarken, ben sadece bazen çok garip hatalar Şimdi bile bir sorun olduğunu biliyorum ... yeniden birleştirme sayesinde bulabilirsiniz. Bir kural gibi yapmak istiyorum "her zaman Önsöz çizgi ile liste üreteçleri temp var", ama bile o kadar aptal geçirmez değil.

Bu rasgele aslında bomba olumsuzlar gibi bekleyen tüm güzel "kullanım kolaylığı" liste üreteçleri.

CEVAP
16 Kasım 2010, Salı


Liste üreteçleri Python Python 3'te 2'de ama döngü denetim değişkeni sızıntısı. İşte explaining bunun arkasındaki tarihi Guido van Rossum (Python'un yaratıcısı):

Biz de Python başka bir değişiklik yaptı Denklik geliştirmek için 3, arasındaki listesi kapsam ve jeneratör ifadeler. 2, liste Python anlama "sızıntı" döngü denetimi çevredeki kapsamı içine değişken:

x = 'before'
a = [x for x in 1, 2, 3]
print x # this prints '3', not 'before'

Bu orijinal bir eser oldu liste uygulaması kapsam; Python "küçük kirli biriydi "yıllardır. sırları Dışarı çıkmaya başladı liste yapmak için kasıtlı bir uzlaşma hızlı ve göz kamaştırıcı bir kapsam yaygın bir hatadır için değil iken yeni başlayanlar, kesinlikle insanlar soktu bazen. Jeneratör için bu ifadeler yapabiliriz. Jeneratör ifadeler uygulanır kimin yürütme jeneratörleri kullanarak, yürütme gerektiren ayrı bir çerçeve. Böylece, jeneratör ifadeler eğer onlar yineleme (özellikle üzerinde kısa sıra) daha az verimli değildi daha liste üreteçleri.

3, karar verdik Python ancak, düzeltme "" listesi küçük kirli sırrı aynı kullanarak kapsam uygulama olarak strateji jeneratör ifadeler. Böylece, Python 3, yukarıdaki örnekte (sonra baskı kullanmak için modifikasyon(x) :-) print'', 'x'kanıtlama önce liste anlama geçici olarak ama 'x'geçersiz kılmaz gölgeler çevredeki kapsamında.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Droid Life

    Droid Life

    17 Kasım 2009
  • J Medema

    J Medema

    11 EKİM 2006
  • The Computer Chronicles

    The Computer

    7 Kasım 2012