2013-10-21 28 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] 

相當於爲什麼Python的列表理解循環順序倒退?

>>> 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] 

這句法似乎向後讀取時左到右。根據PEP 202,「表格[... for x... for y...]嵌套,最後一個索引變化最快,就像嵌套for循環。」是「合適的人」。

看起來,這個順序(從左到右對應於外部到內部嵌套for循環)被選中,因爲這是嵌套for循環的順序被寫入。但是,由於列表理解的表達式部分(在上例中爲a)對應於嵌套循環的最內部分的表達式(上例中的new_list.append(a)),因此在我看來,最近for _ in _這種表達應該是在這兩種情況下是相同的,也就是說,它應該是for a in b和向外:

>>> 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 

,這樣最快變化的循環是最接近行動,所以來講話。這也適合以更邏輯的逐步方式從左至右閱讀。

這是用戶間的共同情感嗎?或者是否有人對於爲什麼當前的語法實現真的是「正確的一個」有很好的反駁?

+6

這是BDFL宣言。除非Guido在這裏發帖,否則所有的答案都是猜測和觀點,我擔心。 –

+6

我在想象一個替代的宇宙,它以另一種方式完成,而另一個用戶 - 例如稱爲「hemaj」 - 來到SO併發佈一個問題,問「爲什麼Python的列表理解循環從對於循環次序?「 – DSM

+3

我預計這個問題將被關閉,但」與預先存在的'for循環次序「是Guido需要的所有答案。這可能需要一個*殺手*很好的理由才能反對這麼多。 –

回答

6

考慮:

[leaf for branch in tree for leaf in branch] 

它解開,如:

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

如果我們寫它的其他方式

[leaf for leaf in branch for branch in tree] 

它可能會更有意義用簡單的英語在一定程度上,但可能的反說法是這裏名稱「分支」的使用沒有(尚未)定義

+1

這是一個很好的觀點,因爲'for foo in bar'總是定義'foo',並且期望'bar'已經被定義。不是我的意見發生了變化:/ – jameh

+2

但是,我可以對你做出同樣的論證 - 即名稱「leaf」在未被定義的情況下使用。 (假設我們正在從左到右閱讀) – jameh

+0

在這裏,'leaf'就是這個「自由變量」,就像謂詞演算一樣 - 例如,{x:P(x)}如何像「x這樣P(x)「 – wim