LINUX.ORG.RU

История изменений

Исправление 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.