История изменений
Исправление soomrack, (текущая версия) :
Если вопрос, про как если дёргать в теле цикла, то тоже самое, что дёрнули бы лишний раз next. Поэтому и не надо так делать.
А причем тут __next___
?
list.pop(0)
это не __next___
и никак с ним не связан, хотя эффект, иногда действительно такой же как от дополнительного вызова __next___
.
Как мне кажется, изменение списка путем my_list.pop(0)
изменяет все существующие iterator’ы, которые получены от объекта my_list. Но как устроен iterator? Что это? Не является ли этот объект просто ссылкой на наш my_list + номер текущей позиции? Есть подозрение, что да, так и есть, но хотелось бы прочитать это где-то в документации. Тогда будет понято хотя бы что происходит.
Вот вполне легальный код, уже без for
:
my_list = [0, 1, 2, 3]
my_iter = iter(my_list)
item = next(my_iter)
print(item)
item = next(my_iter)
print(item)
my_list.pop(0)
item = next(my_iter)
print(item)
0
1
3
И если бы я не знал немного про Python, то ожидал бы вывод 0 1 2.
PS: и спрашивается зачем для всего это создавать итераторы и грузить всех ими, когда для почти всех (всех?) базовых типов это просто индекс в их представлении, как массива?!! Причем этот индекс никак не корректируется, когда объект меняется, и соотв. текущее положение «сползает»!
Исправление soomrack, :
Если вопрос, про как если дёргать в теле цикла, то тоже самое, что дёрнули бы лишний раз next. Поэтому и не надо так делать.
А причем тут __next___
?
list.pop(0)
это не __next___
и никак с ним не связан, хотя эффект, иногда действительно такой же как от дополнительного вызова __next___
.
Как мне кажется, изменение списка путем my_list.pop(0)
изменяет все существующие iterator’ы, которые получены от объекта my_list. Но как устроен iterator? Что это? Не является ли этот объект просто ссылкой на наш my_list + номер текущей позиции? Есть подозрение, что да, так и есть, но хотелось бы прочитать это где-то в документации. Тогда будет понято хотя бы что происходит.
Вот вполне легальный код, уже без for
:
my_list = [0, 1, 2, 3]
my_iter = iter(my_list)
item = next(my_iter)
print(item)
item = next(my_iter)
print(item)
my_list.pop(0)
item = next(my_iter)
print(item)
0
1
3
И если бы я не знал немного про Python, то ожидал бы вывод 0 1 2.
PS: и спрашивается зачем для всего это создавать итераторы и грузить всех ими, когда для почти всех (всех?) базовых типов это просто индекс в их представлении, как массива?!!
Исправление soomrack, :
Если вопрос, про как если дёргать в теле цикла, то тоже самое, что дёрнули бы лишний раз next. Поэтому и не надо так делать.
А причем тут __next___
?
list.pop(0)
это не __next___
и никак с ним не связан, хотя эффект, иногда действительно такой же как от дополнительного вызова __next___
.
Как мне кажется, изменение списка путем my_list.pop(0)
изменяет все существующие iterator’ы, которые получены от объекта my_list. Но как устроен iterator? Что это? Не является ли этот объект просто ссылкой на наш my_list + номер текущей позиции? Есть подозрение, что да, так и есть, но хотелось бы прочитать это где-то в документации. Тогда будет понято хотя бы что происходит.
Вот вполне легальный код, уже без for
:
my_list = [0, 1, 2, 3]
my_iter = iter(my_list)
item = next(my_iter)
print(item)
item = next(my_iter)
print(item)
my_list.pop(0)
item = next(my_iter)
print(item)
0
1
3
И если бы я не знал немного про Python, то ожидал бы вывод 0 1 2.
PS: и спрашивается зачем для всего это создавать итераторы и грузить всех ими, когда для почти всех (всех?) базовых типов это просто индекс в их представлении, как массива.
Исходная версия soomrack, :
Если вопрос, про как если дёргать в теле цикла, то тоже самое, что дёрнули бы лишний раз next. Поэтому и не надо так делать.
А причем тут __next___
?
list.pop(0)
это не __next___
и никак с ним не связан, хотя эффект, иногда действительно такой же как от дополнительного вызова __next___
.
Как мне кажется, изменение списка путем my_list.pop(0)
изменяет все существующие iterator’ы, которые получены от объекта my_list. Но как устроен iterator? Что это? Не является ли этот объект просто ссылкой на наш my_list + номер текущей позиции? Есть подозрение, что да, так и есть, но хотелось бы прочитать это где-то в документации. Тогда будет понято хотя бы что происходит.
Вот вполне легальный код, уже без for
:
my_list = [0, 1, 2, 3]
my_iter = iter(my_list)
item = next(my_iter)
print(item)
item = next(my_iter)
print(item)
my_list.pop(0)
item = next(my_iter)
print(item)
0
1
3
И если бы я не знал немного про Python, то ожидал бы вывод 0 1 2.