является ли повторяемый объект копией исходного объекта? - PullRequest
0 голосов
/ 27 марта 2020
nums = [1,2,3,4,5]

it = iter(nums)

print(next(it))

print(next(it))

for i in nums:
   print(i)

here the result is:
1
2
1
2
3
4
5

Итак, мой вопрос в том, что когда мы применяем метод iter к объекту, то создает ли он копию объекта, для которого он запускает следующий метод?

Ответы [ 4 ]

0 голосов
/ 27 марта 2020

iter(object) возвращает объект итератора , который является версией итератора данного объекта, учитывая, что он реализует __iter__. iter(object) не создает копию объекта.

>>> l=[[1,2],[4,5]]
>>> it=iter(l)
>>>next(it).append(3) #appending to the output of next() mutates the list l
>>> l
[[1,2,3],[4,5]]
>>> next(it).append(6)
>>> l
[[1,2,3],[4,5,6]]
>>> it=iter(l)
>>> l.pop() #Mutating the list l mutated iterator it.
[4,5,6]
>>>list(it)
[[1,2,3]]
0 голосов
/ 27 марта 2020

Вот один из способов выяснить это:

lst = ['Hi', 'I am a copy!']
itr = iter(lst)
print(next(itr))
lst[1] = 'I am _not_ a copy!'
print(next(itr))

(iter(lst) не создает копию lst)

0 голосов
/ 27 марта 2020

Нет, они не. Некоторые типы Python, например, все его коллекции, просто поддерживают итерацию несколько раз. Несколько объектов-итераторов могут содержать ссылки на один и тот же список, все они просто сохраняют свою собственную позицию в списке.

Обратите внимание на некоторые эффекты:

lst = [1,2,3,4,5]
it = iter(lst)
lst.pop()  # modify the original list

list(it)  # the iterator is affected
# [1,2,3,4]

Еще более очевидным является случай исчерпывающего итераторы и вызов на них iter:

it1 = iter(range(10))
it2 = iter(it1)
next(it)
# 0
next(it2)
# 1
next(it)
# 2
next(it2)
# 3

Очевидно, что итераторы разделяют состояние.

0 голосов
/ 27 марта 2020

Оператор = назначает значения от правых операндов к левым операндам, т. Е. c = a + b присваивает значение a + b c Операторам

Вы не изменяете никакие переменные, присутствующие в правой части строки присваивания, к копии значения применяется функция, а затем этому результату присваивается имя новой переменной it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...