2013-10-21 17 views
9
>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]] 
>>> [a for d in my_list for c in d for b in c for a in b] 
[1, 2, 3, 4, 5, 6] 

okunan Bu sözdizimi geriye görünüyorPython'un liste anlama döngüleri sırası neden geriye doğru?

>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]] 
>>> new_list = [] 
>>> for d in my_list: 
...  for c in d: 
...   for b in c: 
...    for a in b: 
...     new_list.append(a) 
... print(new_list): 
[1, 2, 3, 4, 5, 6] 

eşdeğerdir soldan sağa. PEP 202'a göre, "[... for x... for y...] yuvaları, son dizgiyle en hızlı şekilde değişiyor, tıpkı döngüler için yuvalanmış gibi." "Doğru Olan".

Öyle görünüyor ki bu düzen (sol sağa dış to-iç döngüler için iç içe karşılık gelen) bu döngüler yazılır için hangi iç içe düzenden dolayı seçildi.

Ancak, liste anlama (yukarıdaki örnekte a) ekspresyonu yapan kısmı, (yukarıdaki örnekte new_list.append(a)) iç içe döngüler en iç kısmında ifadeye karşılık gelir, bana görünüyor üzerinde dışa for a in b olmalı ve yani bu ifadenin en yakın for _ in _, her iki durumda da aynı olmalıdır:

>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]] 
>>> [a for a in b for b in c for c in d for d in my_list] 
NameError: name 'b' is not defined 

yüzden en hızlı değişen döngü böylece-to-konuşmak, eyleme yakın olduğunu. Bu aynı zamanda soldan sağa daha mantıklı adımlarla okunduğuna da kendini gösterir.

bu kullanıcılar arasında yaygın bir duygu var mı? veya şu anki sözdizimi uygulamasının gerçekte neden "Doğru Bir" olduğu konusunda iyi bir karşı argümanı var mı?

+6

Bu bir BDFL bildirisidir. Guido burada yazmazsa, tüm cevaplar spekülasyon ve fikirdir, korkarım. –

+6

Başka bir şekilde yapıldığı alternatif bir evren hayal ediyorum ve "hemaj" denen başka bir kullanıcı SO 'ya geliyor ve soruyu soran bir soru gönderiyor "Neden Python'un listesi anlama döngü sırası geriye doğru Döngü siparişi için? .. – DSM

+3

Bu sorunun kapanacağını bekliyorum, fakat “döngü emri için önceden var olan” ile tutarlılık Guido'nun ihtiyaç duyacağı her şey. Sadece bu kadarına karşı gitmek için * katil * iyi bir sebep olurdu. –

cevap

6

düşünün:

[leaf for branch in tree for leaf in branch] 

Sanki unrolls: Biz Bazı düzeyde düz İngilizce daha mantıklı olabilir

[leaf for leaf in branch for branch in tree] 

başka yolu yazarsanız

for branch in tree: 
    for leaf in branch: 
     yield leaf 

, fakat olası bir karşı argüman, burada "branch" isminin.

+1

Bu, "foo in bar" için her zaman foo 'yu tanımladığı ve "bar" ın önceden tanımlanmasını beklediği anlamda iyi bir nokta. Benim düşüncem değişmedi:/ – jameh

+2

Bununla birlikte, sana karşı aynı argümanı yapabilirim - yani 'yaprak' ismi henüz tanımlanmayan (henüz) tanımlanır. (soldan sağa doğru okuduğumuzu farz edelim) – jameh

+0

Kuyruk, burada "serbest değişken" olacaktır, örneğin taksim hesabı gibi - örneğin, {x: P (x)} nasıl okunur " öyle ki P (x) " – wim

İlgili konular