【问题标题】:Why the copy of iter() pointing to the same location? [duplicate]为什么 iter() 的副本指向同一个位置? [复制]
【发布时间】:2021-10-29 04:31:15
【问题描述】:
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,它指向内存中的 same 对象
  • 赋值从不复制 Python 中的数据。
  • "作为一个简单的例子,x&y 都有不同的内存位置" 不,他们没有。 xy引用同一个对象。但是,x=7 * 不会改变 x 所指的任何对象,它只是将名称 x 重新分配给一个新对象
  • x 只是一个生成器对象,y 是 x,所以当 x 的 evr next 被调用时,next(x) 的值在 x 和 y 中都会更新

标签: python iteration


【解决方案1】:

在第一个例子中

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 方法时,您是在更改该位置的对象,而不是在其他位置创建新对象。

【讨论】:

  • you are changing the object at that location这里的对象是iter(a)
【解决方案2】:

执行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

【讨论】:

  • 注意,普通的copy.copy 应该可以工作。
  • 可能值得指出的是,并非每个迭代器都可以被有意义地复制。例如,复制 map 迭代器只会返回原始的。
  • @juanpa.arrivillaga 可能甚至是preferable.
  • @don'ttalkjustcode 是的,我想这取决于您是否需要深拷贝语义,或者是否需要(或仅仅足够)浅拷贝\
  • @MisterMiyagi 其实它seems to 给了一个单独的独立迭代器。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2019-04-29
  • 2012-07-09
相关资源
最近更新 更多