为什么iter()的副本指向相同的位置?


x=5
y=x
x=7
# Changing the value of x does not effect the value of y

作为一个简单的例子,x&y有不同的内存位置,所以改变一个不影响其他

但是在下面的代码中next(y)4为什么?根据我的逻辑,我错的地方一定是1

a=[1,2,3,4,5,6,7,8,9,10]
x=iter(a)
y=x
print(next(x))
print(next(x))
print(next(x))
print(next(y))

执行y=x创建的命名引用y基本上指向与变量x指向的相同的内存位置,您可以使用内置的id(给出内存位置表示)来验证它:

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> x=iter(a)
>>> y=x
>>> id(x)
1714277910984
>>> id(y)
1714277910984

如果你想要一个迭代器x的副本,你可以使用copy模块中的deepcopy函数:

>>> from copy import deepcopy
>>> y = deepcopy(x)
>>> id(x)
1714277910984
>>> id(y)
1714135198792

现在xy是两个不同的迭代器:

>>> next(x)
1
>>> next(y)
1
>>> next(x)
2
>>> next(y)
2

在第一个例子中

x=5
y=x
x=7

第二行之后,xy指向同一个对象,即5。当您更改x时,y保持5,因为您没有更改对象5本身,但您只是更改了x指向的位置。然而,在第二个例子中,

a=[1,2,3,4,5,6,7,8,9,10]
x=iter(a)
y=x
print(next(x))
print(next(x))
print(next(x))
print(next(y))

xy仍然指向相同的位置。但是当你调用next方法时,你是在改变那个位置的对象,而不是在另一个位置创建一个新对象。

最新更新