Đối với những gì thực sự xảy ra trong cho loop:
TừPython for statement documentation:
Các danh sách biểu thức được đánh giá sau khi; cần tạo đối tượng có thể lặp lại. Trình lặp được tạo cho kết quả của expression_list
. Sau đó, suite được thực hiện một lần cho mỗi mục được cung cấp bởi máy phát lặp , theo thứ tự chỉ số tăng dần. Mỗi mục lần lượt là được gán cho mục tiêu danh sách sử dụng các quy tắc tiêu chuẩn cho bài tập, và sau đó bộ được thực thi. Khi các mặt hàng đang cạn kiệt (đó là ngay lập tức khi chuỗi là trống), bộ ứng dụng trong mệnh đề else
, nếu có, được thực thi, và loop
chấm dứt.
Tôi nghĩ điều đó được thể hiện tốt nhất với sự trợ giúp của hình minh họa minh họa.
Bây giờ, giả sử bạn có một iterable object
(như list
) như thế này:
out = [a, b, c, d, e, f]
gì xảy ra khi bạn làm for x in out
là nó tạo nội indexer mà đi như thế này (tôi minh họa cho nó với biểu tượng ^
):
[a, b, c, d, e, f]
^ <-- here is the indexer
gì thường xảy ra đó là: khi bạn kết thúc một chu kỳ của vòng lặp của bạn, di chuyển indexer chuyển tiếp như thế này:
[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[a, b, c, d, e, f] #cycle 2
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 3
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 4
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 5
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 6
^<-- here is the indexer
#finish, no element is found anymore!
Như bạn có thể thấy, indexer tiếp tục di chuyển về phía trước cho đến cuối danh sách của bạn, bất kể những gì đã xảy ra với danh sách!
Như vậy khi bạn làm remove
, đây là những gì đã xảy ra trong nội bộ:
[a, b, c, d, e, f] #cycle 1
^ <-- here is the indexer
[b, c, d, e, f] #cycle 1 - a is removed!
^ <-- here is the indexer
[b, c, d, e, f] #cycle 2
^<-- here is the indexer
[c, d, e, f] #cycle 2 - c is removed
^<-- here is the indexer
[c, d, e, f] #cycle 3
^<-- here is the indexer
[c, d, f] #cycle 3 - e is removed
^<-- here is the indexer
#the for loop ends
Chú ý rằng chỉ có 3 chu kỳ có thay vì 6 chu kỳ (!!) (là số lượng các phần tử trong danh sách gốc). Và đó là lý do bạn rời đi với một nửalen
trong số len
ban đầu của bạn, vì đó là số chu kỳ cần để hoàn thành vòng lặp khi bạn xóa một phần tử khỏi nó cho mỗi chu kỳ.
Nếu bạn muốn xóa danh sách, chỉ cần làm:
if (out != []):
out.clear()
Hoặc cách khác, để loại bỏ các phần tử từng người một, bạn cần phải làm điều đó cách khác xung quanh - từ kết thúc vào đầu. Sử dụng reversed
:
for x in reversed(out):
out.remove(x)
Bây giờ, tại sao công việc reversed
? Nếu người lập chỉ mục tiếp tục di chuyển về phía trước, thì không phải reversed
cũng sẽ không hoạt động do số lượng phần tử được giảm một lần cho mỗi chu kỳ không?
Không, nó không giống như vậy,
Vì reversed
phương pháp thay đổi cách để indexer nội công trình! Điều gì đã xảy ra khi bạn sử dụng phương pháp reversed
là để làm cho chỉ mục nội bộ di chuyển lùi (từ cuối) thay vì về phía trước.
Để minh họa, đây là những gì thường xảy ra:
[a, b, c, d, e, f] #cycle 1
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 2
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 3
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 4
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 5
^<-- here is the indexer
[a, b, c, d, e, f] #cycle 6
^ <-- here is the indexer
#finish, no element is found anymore!
Và như vậy, khi bạn làm một việc loại bỏ mỗi chu kỳ, nó không ảnh hưởng đến cách indexer hoạt động:
[a, b, c, d, e, f] #cycle 1
^<-- here is the indexer
[a, b, c, d, e] #cycle 1 - f is removed
^<-- here is the indexer
[a, b, c, d, e] #cycle 2
^<-- here is the indexer
[a, b, c, d] #cycle 2 - e is removed
^<-- here is the indexer
[a, b, c, d] #cycle 3
^<-- here is the indexer
[a, b, c] #cycle 3 - d is removed
^<-- here is the indexer
[a, b, c] #cycle 4
^<-- here is the indexer
[a, b] #cycle 4 - c is removed
^<-- here is the indexer
[a, b] #cycle 5
^<-- here is the indexer
[a] #cycle 5 - b is removed
^<-- here is the indexer
[a] #cycle 6
^ <-- here is the indexer
[] #cycle 6 - a is removed
^ <-- here is the indexer
Hope hình minh họa giúp bạn hiểu những gì đang diễn ra trong nội bộ ...
"Sau đó, tôi cố gắng xóa mọi thứ khỏi danh sách" - hãy tìm hiểu kỹ hơn tại đây. Tại sao bạn muốn làm nó? –
Vì tôi đang di chuyển các giá trị từ danh sách sang một từ điển theo cặp, như giá trị đầu tiên trong cặp là khóa và giá trị thứ hai là giá trị. Điều này là từ điển của tôi là không đầy đủ do tôi không thể lặp qua danh sách đầy đủ - nó nói chỉ có 96 chỉ mục. – user4447655
Nếu bạn có thể đăng mã bằng chuỗi và dict bạn đang sử dụng, chúng tôi sẽ cung cấp giải pháp dễ dàng hơn. Vấn đề có thể ở đâu đó khác với những gì bạn đã cho chúng tôi cho đến nay. – MKreegs