2015-04-23 17 views
5

Hãy xem xét các đoạn mã sau đây Python:Python cho vòng lặp - tại sao điều này không lặp vô hạn?

x = 14 
for k in range(x): 
    x += 1 

Vào cuối thực hiện, x bằng 28.

Câu hỏi của tôi: không nên này mã vòng lặp mãi mãi? Tại mỗi lần lặp lại, nó sẽ kiểm tra nếu k nhỏ hơn x. Tuy nhiên, x được tăng lên trong vòng lặp for, vì vậy nó có giá trị cao hơn cho lần so sánh tiếp theo.

+0

Phiên bản nào của Python bạn đang sử dụng? – thefourtheye

Trả lời

9

range(x) không phải là "lệnh". Nó tạo ra một đối tượng phạm vi một lần và vòng lặp lặp lại trên đó. Thay đổi x không thay đổi tất cả các đối tượng đã được thực hiện bằng cách sử dụng nó.

>>> x = 2 
>>> k = range(x) 
>>> list(k) 
[0, 1] 
>>> x += 1 
>>> list(k) 
[0, 1] 
6

không, range(x) sẽ trả về một danh sách với các mục [0,1,2,3,4,5,6,7,8,9,10,11,12,13] các mặt hàng này sẽ được lặp lại. Mỗi lần cơ thể vòng lặp được đánh giá thay đổi giá trị của x nhưng điều này không ảnh hưởng đến danh sách đã được tạo ra.

nói cách khác, bộ sưu tập mà bạn sẽ lặp lại sẽ chỉ được tạo một lần.

+2

Để trở thành pedantic, nó trả về một danh sách trong Python 2 và một đối tượng 'range' trong Python 3. – Blair

1

Đó là bởi vì trăn for in vòng lặp có hành vi khác nhau so với for (bằng các ngôn ngữ khác): range(x) không được thực hiện trong mỗi lần lặp, nhưng tại thời điểm đầu tiên, và sau đó for in lặp trên phần tử của nó. Nếu bạn muốn thay đổi mã để chạy vòng lặp vô hạn, bạn có thể sử dụng một số while thay thế (và trong trường hợp đó (x) là vô nghĩa).

0

for loop trong python không phải là trình lặp, mà là lặp qua trình tự/trình tạo, tức là bất kỳ hình thức nào của iterable.

Xem xét điều này, trừ khi lặp lại là vô hạn, vòng lặp sẽ không vô hạn. Một sequence không thể là vô hạn nhưng bạn có thể có thể tạo/sử dụng một bộ tạo vô hạn. Một khả năng là sử dụng itertools.count tạo ra một dãy số không kết thúc bắt đầu từ một khởi đầu được chỉ định với một khoảng thời gian cụ thể.

from itertools import count  | for(;;) { 
for i in count(0):     |  //An infinite block 
    #An infinite block    | } 

Ngoài ra, bạn luôn có thể sử dụng vòng lặp while để tạo ra một vòng lặp vô hạn cổ điển

while True: 
    #An infinite block 
Các vấn đề liên quan