可迭代对象是原始对象的副本吗?

时间:2020-03-27 05:29:30

标签: python iterator

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 :(得分:0)

= 运算符将值从右侧操作数分配到左侧操作数”,即c = a + ba + b的值分配给c {{ 3}}

您没有更改赋值行右侧的任何变量,值的副本已应用了一个函数,然后将该结果分配了新的变量名 {{1} }

答案 1 :(得分:0)

这是一种解决方法:

Write a sentence: I want to try.
try to want I.

({lst = ['Hi', 'I am a copy!'] itr = iter(lst) print(next(itr)) lst[1] = 'I am _not_ a copy!' print(next(itr)) 不会创建iter(lst)的副本)

答案 2 :(得分:0)

不,他们没有。一些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

很明显,迭代器共享状态。

答案 3 :(得分:0)

iter(object)返回一个 iterator对象,它是实现了__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]]