gpt4 book ai didi

python - container.__iter__() 和 iterator.__iter__() 有什么区别?

转载 作者:行者123 更新时间:2023-11-28 19:50:59 26 4
gpt4 key购买 nike

本人python水平很差,请不要打我。

>>> a = ['a', 'b', 'c']
>>> a.__iter__()
<listiterator object at 0x03531750>
>>> a.__iter__().__iter__()
<listiterator object at 0x03531690>

我看到这两个 listiterator 对象都在其他地方(0x03531750 真的像地方吗?)。我需要知道这两个对象是相同的,但生活在其他地方还是不同?

最佳答案

迭代器有一个 __iter__() 方法,因此您可以调用 iter() 来为它获取一个迭代器,即使它已经是一个迭代器。如果您不必经常检查某些东西是否已经是迭代器,则可以更轻松地编写使用迭代器的东西。

所以您正在为列表获取一个迭代器,然后为该迭代器获取一个迭代器。迭代器的迭代器是原始迭代器(Python 不会创建第二个迭代器,没有意义)。

好的,到目前为止还不错。

迭代器是对象,并且像所有对象一样,具有生命周期。它们在您调用对象上的 __iter__()(或 iter())时创建,并在不再有任何对它们的引用时销毁。在您的示例中,您执行了 a.__iter__(),它创建了列表迭代器。然后,由于您没有在任何地方保留对 it 的引用,因此该迭代器或多或少会立即被销毁(尽管这是一个实现细节)。所以你的下一个命令 a.__iter__().__iter__() 为列表创建一个迭代器(只有一个,因为迭代器的迭代器是同一个迭代器) -- 它不会重用您在上一个命令中创建的迭代器,因为该迭代器已不存在。这就是对象具有不同 ID 的原因;它们实际上是不同的对象。

如果您保留对前者的引用,您将看到 a.__iter__()a.__iter__().__iter__() 是同一个对象。试试这个:

a = ['a', 'b', 'c']
i = iter(a) # a.__iter__()
j = iter(i) # i.__iter__() which is a.__iter__().__iter__()
print i is j # True, they're the same object

关于python - container.__iter__() 和 iterator.__iter__() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8125930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com