2016-01-27 16 views
8

Tôi thấy điều này cho vòng lặp và tôi đã không hoàn toàn hiểu tại sao in cuối cùng là 2. Tại sao nó không phải là 3?Weird for loop statement

a = [0, 1, 2, 3] 

for a[-1] in a: 
    print(a[-1]) 

ra:

0 
1 
2 
2 
+5

Hai mươi năm Python, và tôi chưa bao giờ nghĩ đến việc làm 'cho một [x] trong một:'. Cảm ơn :-) – RemcoGerlich

+0

Tương tự tại đây; Tôi luôn cho rằng nó phải là một cái tên, chứ không phải là một giá trị tùy ý. – chepner

+0

@chepner: nó chỉ là một danh sách mục tiêu. Vì vậy, 'modulename.global_var' cũng hợp lệ. Hoặc 'từ điển [khóa]'. Hoặc một danh sách những người .. –

Trả lời

20

Vòng lặp for sử dụng a[-1] như là một biến mục tiêu, gán mỗi giá trị từ đầu vào iterable:

for <target> in <iterable> 

Vòng lặp for gán mỗi giá trị trong danh sách a cho một mục tiêu đó, a[-1]. Điều đó cũng xảy ra với cũng là phần tử cuối cùng trong cùng một danh sách đó.

Vì vậy, danh sách thay đổi với mỗi bước qua vòng lặp:

>>> a = [0, 1, 2, 3] 
>>> for a[-1] in a: 
...  print a 
... 
[0, 1, 2, 0] # assigned a[0] == 0 to a[-1] (or a[3]) 
[0, 1, 2, 1] # assigned a[1] == 1 to a[-1] 
[0, 1, 2, 2] # assigned a[2] == 2 to a[-1] 
[0, 1, 2, 2] # assigned a[3] == 2 (since the previous iteration) to a[-1] 

Các lặp one-nhưng-cuối cùng gán puts a[2] vào a[3] (hoặc a[-2] vào a[-1]), và đó là lý do tại sao, khi lặp lại lần cuối diễn ra, bạn thấy 2lại.

Xem for loop grammar; cần có một mục tiêu chung target_list cho mục tiêu chuyển nhượng, giống như một assigment statement. Bạn không bị giới hạn chỉ với những cái tên đơn giản trong các bài tập, và bạn cũng không ở trong vòng lặp for.