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

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

+6

Đâ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. –

+6

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

+3

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

Trả lời

6

xem xét:

[leaf for branch in tree for leaf in branch] 

Nó unrolls như:

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

Nếu chúng ta viết nó theo cách khác

[leaf for leaf in branch for branch in tree] 

Nó có thể làm cho ý nghĩa hơn bằng tiếng Anh trên một mức độ nào, nhưng một đối số có thể có là ở đây tên "nhánh" được sử dụng mà không bị (chưa) được xác định.

+1

Đây là một điểm tốt, theo nghĩa là 'cho foo trong thanh' luôn định nghĩa' foo' và hy vọng 'bar' đã được xác định. Không phải ý kiến ​​của tôi đã thay đổi:/ – jameh

+2

Tuy nhiên, tôi có thể làm cho cùng một đối số chống lại bạn - tức là tên 'lá' được sử dụng mà không bị (chưa) được xác định. (giả sử chúng ta đang đọc từ trái sang phải) – jameh

+0

Vâng 'lá' sẽ là" biến tự do "ở đây, như trong tính toán vị ngữ - ví dụ, cách {x: P (x)} đọc như" tập hợp x như vậy mà P (x) " – wim

Các vấn đề liên quan