>>> 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ループに対応する)が選択されたようです。
しかし、リスト内包(上記の例ではa
)の表現部分は、ネストされたループの中で最下位の式(上の例ではnew_list.append(a)
)に対応しているため、それが外側にfor a in b
こととすべきである。すなわち、この表現に最も近いfor _ in _
は、どちらの場合も同じでなければなりません:
>>> 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
最速の変化ループはそう-発言、行動に最も近いように。これはまた、より論理的に段階的に左から右へ読むことに役立ちます。
これはユーザー間で共通の感想ですか?現在の構文実装が本当に「正しいもの」である理由について誰かが良い反論を持っていますか?
これはBDFLの宣言です。 Guidoがここに投稿しない限り、すべての答えは推測と意見です、私は恐れています。 –
私は、別の方法で行われた別の宇宙を想像しています。もう1人のユーザー、例えば、「hemaj」と呼ばれるユーザーがSOに来て、「なぜPythonのリストの理解ループが、 forループの順序? ".. – DSM
私はこの質問が閉じられると期待していますが、"既存の 'for'ループの順序付けとの一貫性はGuidoが必要としていたすべての答えです。それはちょうどそれに逆らっていくために*キラー*良い理由を取っていたでしょう。 –