2013-02-09 33 views
29

Giả sử tôi có một vòng lặp for:Làm thế nào để thay đổi chỉ số của vòng lặp trong Python?

for i in range(1,10): 
    if i is 5: 
     i = 7 

Tôi muốn thay đổi i nếu nó đáp ứng điều kiện nhất định. Tôi đã thử điều này nhưng không hoạt động. Tôi làm cách nào để tìm hiểu?

+2

Sử dụng vòng lặp 'while' và thay vì' is' sử dụng '=='. –

+1

Tại sao bạn muốn thay đổi chỉ mục lặp lại? Đây chắc chắn là một mùi. –

+0

Tôi đang viết một cái gì đó giống như một thông dịch viên lắp ráp mã. Vì vậy, tôi phải chuyển sang một số hướng dẫn nhất định do việc triển khai của tôi. – drum

Trả lời

48

Ví dụ cụ thể của bạn, điều này sẽ làm việc:

for i in range(1, 10): 
    if i in (5, 6): 
     continue 

Tuy nhiên, bạn có lẽ sẽ tốt hơn với một vòng lặp while:

i = 1 
while i < 10: 
    if i == 5: 
     i = 7 
    # other code 
    i += 1 

Một vòng lặp for gán một biến (trong trường hợp này i) thành phần tử tiếp theo trong danh sách/có thể lặp lại ở đầu mỗi lần lặp. Điều này có nghĩa là bất kể bạn làm gì bên trong vòng lặp, i sẽ trở thành thành phần tiếp theo. Vòng lặp while không có giới hạn nào như vậy.

+1

Đây có phải là cách duy nhất không? Cảm thấy lộn xộn. – drum

+17

@drum: Muốn thay đổi chỉ số vòng lặp theo cách thủ công từ bên trong vòng lặp, cảm thấy lộn xộn. – BrenBarn

+2

Với một 'while', ít nhất, chúng tôi không nhầm lẫn nó cho một vòng lặp" thường xuyên "lặp lại trên phạm vi mà nó hứa hẹn sẽ lặp lại. –

1

Khái niệm này không phải là bất thường trong thế giới C, nhưng nên tránh nếu có thể. Tuy nhiên, đây là cách tôi thực hiện nó, theo cách mà tôi cảm thấy rõ ràng những gì đang xảy ra. Sau đó, bạn có thể đặt logic của bạn để bỏ qua phía trước trong chỉ mục bất cứ nơi nào bên trong vòng lặp, và người đọc sẽ biết phải chú ý đến các biến bỏ qua, trong khi nhúng một i = 7 ở đâu đó sâu có thể dễ dàng bị bỏ qua:

skip = 0 
for i in range(1,10): 
    if skip: 
     skip -= 1 
     continue 

    if i=5: 
     skip = 2 

    <other stuff> 
+1

Mặc dù bỏ qua là một lựa chọn, nó chắc chắn không phải là câu trả lời thích hợp cho câu hỏi này.Theo câu hỏi, người ta cũng có thể đi qua lại trong một vòng lặp. Câu trả lời được chấp nhận giải quyết vấn đề này với một vòng lặp while. – drum

3

Một chút nền tảng về lý do tại sao vòng lặp trong câu hỏi không hoạt động như mong đợi.

Một vòng lặp

for i in iterable: 
    # some code with i 

cơ bản một viết tắt cho

iterator = iter(iterable) 
while True: 
    try: 
     i = next(iterator)    
    except StopIteration: 
     break 
    # some code with i 

Vì vậy, các for loop chiết xuất giá trị từ một iterator xây dựng từ một iterable bởi một và tự động nhận ra khi iterator đó là kiệt sức và dừng lại.

Như bạn có thể thấy, trong mỗi lần lặp của vòng lặp whiletôi được bố trí, do đó giá trị của i sẽ được ghi đè bất kể reassignments khác bạn phát hành ở phần # some code with i. Vì lý do này, for vòng trong Python không phù hợp cho các thay đổi vĩnh viễn đối với biến vòng lặp và bạn nên sử dụng vòng lặp while thay thế, như đã được minh chứng trong câu trả lời của Volatility.

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