- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本人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/
我正在实现本质上是一个容器对象(尽管它确实有一些自己的逻辑)。我希望能够迭代此类(这只是一个普通列表)中的一个字段中的项目。我应该为我的类(class)重新实现 __iter__ 和 next 还是可
本人python水平很差,请不要打我。 >>> a = ['a', 'b', 'c'] >>> a.__iter__() >>> a.__iter__().__iter__() 我看到这两个 li
在 python 2.7 和 python 3.7 中,我可以执行以下操作: string = "hello world" for letter in string: print(letter
假设我有一个基类: class Base: A = False B = '' C = '' def __iter__(self): yield 'a',
Python 类定义中的 __iter__ 方法主体有何意义?据我了解, __iter__ 方法必须返回一个迭代器;那么每个 __iter__ 方法不应该只包含一个返回迭代器(在其他地方定义)的 re
我正在尝试创建一个二维数组类并希望使矩阵可迭代。有谁知道该怎么做?我是 python 类(class)的新手,但仍在掌握窍门。另外,如何在我的 main 中实现 str ?如果我只使用 print(c
我读了一本有关 Python 高级主题的书。作者试图解释生成器。 这是他要解释的例子: class rev: def __init__(self,data): self.dat
不确定标题是否清楚,但我有一个对象,它的属性是另一种对象的字典。键是引用对象的 id。我想实现 iter 方法,以便生成这些 key ,但我不确定如何操作。它应该相当简单,但我在 python 文档中
def __init__(self, maximum, start=0, step=1): """Sets the maximum, start, and step"""
我想做的是重用生成器 class Rect(object): ... def __iter__(self): for y in xrange(self.tl.y, self.
使用__iter__有什么好处? Python 类中的函数? 在下面的代码中,我只是设置两个简单的类。第一类接受一个列表作为参数,我可以在不使用 __iter__ 的情况下循环这个列表。功能。第二位代
我不明白为什么 __iter__ 特殊方法只返回调用它的对象(如果它是在迭代器上调用的)。它本质上只是一个标志,表明该对象是一个迭代器吗? 编辑:实际上,我发现“这是允许容器和迭代器与 for 和 i
我有一个对象子类,它使用缓存生成器实现动态调度 __ iter __(我还有一个使 iter 缓存无效的方法),如下所示: def __iter__(self): print("iter ca
尽管阅读了它,但我仍然不太明白 __iter__ 是如何工作的。什么是简单的解释? 我见过 def__iter__(self): return self。我看不到它是如何工作的,也不知道它是如何工作的
我正在实现搜索算法 (BFS) 并具有以下 Node 类: class Node: def __init__(self, state=None, action=None, path_cost=
我有一个 Python 2.7 类(称之为 Child),它是另一个类(Parent)的子类,而另一个类本身就是 dict 的子类。 我正在尝试定义 __iter__在 child 中希望当有人做di
我想将一个类的所有实例存储在一个列表中,并想对其进行迭代。 我尝试了以下两种方法: 1 使用元类 class ClassIter(type): def __iter__(cls):
来源 def flags(*opts): keys = [t[0] for t in opts] words = [t[1] for t in opts] nums = [2*
假设您使用包装器对象: class IterOrNotIter: def __init__(self): self.f = open('/tmp/toto.txt')
我有一个标准的二叉树,如下所示 1 /\ 2 3 /\/\ 4 5 6 7 我需要通过导入我的树类来读取二叉树,创建这棵树,然后使用 for 循环读取它,如:[4, 2, 5, 1, 6, 3, 7]
我是一名优秀的程序员,十分优秀!