Tôi muốn chống lại sự cám dỗ để xử lý các máy phát điện như danh sách. Cách tiếp cận đơn giản nhưng ngây thơ là một lớp lót đơn giản:
gen = (i for i in range(10))
list(gen)[3]
Nhưng hãy nhớ rằng, máy phát không giống như danh sách. Họ không lưu trữ kết quả trung gian của họ ở bất cứ nơi nào, vì vậy bạn không thể đi ngược lại. Tôi sẽ chứng minh vấn đề với một ví dụ đơn giản trong repl python:
>>> gen = (i for i in range(10))
>>> list(gen)[3]
3
>>> list(gen)[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Khi bạn bắt đầu trải qua một máy phát điện để có được giá trị thứ n trong dãy, máy phát điện tại là ở tiểu bang khác, và cố gắng nhận lại giá trị thứ n sẽ trả lại cho bạn một kết quả khác, điều này có khả năng dẫn đến lỗi trong mã của bạn.
Hãy xem một ví dụ khác, dựa trên mã từ câu hỏi.
Ban đầu, người ta sẽ mong đợi những điều sau đây để in 4
hai lần.
gen = (i for i in range(10))
index = 4
for i, v in enumerate(gen):
if i == index:
answer = v
break
print(answer)
for i, v in enumerate(gen):
if i == index:
answer = v
break
print(answer)
nhưng gõ này vào repl và bạn nhận được:
>>> gen = (i for i in range(10))
>>> index = 4
>>> for i, v in enumerate(gen):
... if i == index:
... answer = v
... break
...
>>> print(answer)
4
>>> for i, v in enumerate(gen):
... if i == index:
... answer = v
... break
...
>>> print(answer)
9
Chúc may mắn truy tìm lỗi xuống.
Nguồn
2017-05-30 21:48:52
Bạn không muốn 'is' trong tình huống này (hoặc nhiều tình huống ở tất cả). 'is' là để so sánh danh tính, không bình đẳng. Bạn muốn '=='. Điều này có thể sẽ làm việc trong trường hợp này, nhưng chỉ bởi sự trùng hợp và chi tiết thực hiện. –
Vì tôi đang sử dụng các số nguyên, làm thế nào nó có thể không hoạt động? Thậm chí có thực hành tốt để mong đợi đối tượng 'index' thực thi' __eq__' trong các trường hợp như thế này không? (Đây là việc thoát khỏi chủ đề ...) –
Hãy thử '1000 là 500 + 500', nó sẽ (có thể) là' Sai'. Xem, ví dụ: http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers –