>>> 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]
tương đương vớiTại sao thứ tự vòng lặp danh sách hiểu của Python ngược?
>>> 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]
cú pháp này có vẻ ngược khi đọc từ trái sang phải. Theo số PEP 202, "Hình thức tổ chức [... for x... for y...]
tổ, với chỉ mục cuối cùng thay đổi nhanh nhất, giống như lồng nhau cho vòng lặp." là "Người đúng."
Dường như thứ tự này (từ trái sang phải tương ứng với lồng nhau từ bên ngoài đến bên trong cho vòng lặp) đã được chọn vì đó là thứ tự trong đó lồng nhau cho các vòng được viết.
Tuy nhiên, vì phần biểu thức của việc hiểu danh sách (a
trong ví dụ trên), tương ứng với biểu thức ở phần bên trong nhất của các vòng lồng nhau (new_list.append(a)
trong ví dụ trên), có vẻ như for _ in _
gần gũi nhất với biểu thức này nên là như nhau trong cả hai trường hợp, nghĩa là nó phải được for a in b
và ra phía ngoài:
>>> 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
sao cho nhanh nhất thay đổi vòng lặp là gần nhất với hành động, vì vậy-to-nói. Điều này cũng cho vay chính nó để được đọc từ trái sang phải theo cách hợp lý hơn theo từng bước.
Đây có phải là cảm xúc chung giữa người dùng không? hoặc bất cứ ai có một đối số phản đối tốt là tại sao việc thực hiện cú pháp hiện tại thực sự là "Right One"?
Đây là tuyên bố BDFL. Trừ khi Guido viết ở đây, tất cả các câu trả lời là suy đoán và ý kiến, tôi sợ hãi. –
Tôi đang tưởng tượng một vũ trụ thay thế mà nó được thực hiện theo cách khác, và một người dùng khác - gọi là 'hemaj', ví dụ - đến SO và đăng câu hỏi hỏi "Tại sao thứ tự vòng lặp danh sách của Python ngược lại từ cho thứ tự vòng lặp? ".. – DSM
Tôi mong đợi câu hỏi này sẽ được đóng lại, nhưng" sự nhất quán với tồn tại trước đó 'cho' vòng lặp đặt hàng" là tất cả các câu trả lời Guido sẽ cần thiết. Nó sẽ có một lý do * sát thủ tốt để chống lại điều đó nhiều. –