Python迭代器-用于[something]中的i

Python迭代器-用于[something]中的i,python,Python,在以下代码中: class Box: def __init__(self): self.volume = [] self.index = -1 def add_item(self, item): self.volume.append(item) def __iter__(self): return self def __next__(self): # self.index +=

在以下代码中:

class Box:
    def __init__(self):
        self.volume = []
        self.index = -1

    def add_item(self, item):
        self.volume.append(item)


    def __iter__(self):
        return self

    def __next__(self):
        # self.index +=1     NOTE - It is commented 
        if self.index >= len(self.volume):
            raise StopIteration
        return self.volume[self.index]

class Item:
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight 

b = Box()
b.add_item(Item('Cat', 5))
b.add_item(Item('Nintendo Switch', 1))
b.add_item(Item('Potatoes', 2))

for item in b:
    print('The {} weighs {} kg'.format(item.name.lower(), item.weight))
因此,我们制作一个Box类型的对象“b”,并向其中添加三项

问题1)对于b中的项意味着什么?它指的是什么?b中有什么?

问题2)假设它指的是我们添加到其中的三个项目。为什么它会在内线循环中继续卡在: 马铃薯重2公斤 不去其他2个元素?(如果我增加,效果很好)

谢谢

问题1)-b中的项目表示什么?它指的是什么?b是什么

这是记录在案的:

问题2)-假设它指的是我们添加到其中的三个项目。为什么它会在内部循环中被卡住:土豆重2公斤,而不会被其他2种元素吃掉?(如果我增加,它可以正常工作)

因为如果不增加索引,它永远不会大于
len(self.volume)
,因此迭代器总是生成相同的对象,并且永远不会引发
StopIteration

编辑


当我们在卷变量中添加项目而不是在“b”中添加项目时,它不应该是“b.volume中的i”吗

好的,将
Box
设置为iterable(和迭代器)的目的实际上是隐藏
项的存储方式()-注意客户端代码如何使用
Box.add_Item()
,而不是
Box.volume.append()


当前的实现是错误的,因为它将
.volume
index
公开为公共API的一部分,而这些API应该受到保护(名称的前缀是一个前导下划线,这是Python对“受保护”属性的约定),而且可能也有点不完整(它至少应该公开一种方法来知道该框是否为空/它包含多少项).

我很困惑,为什么你要问b
中项目的
是什么意思。你是否实现了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuut在框中。当项目添加到b中时,它不应该是b中的i吗?这就是我想问的,b中要迭代的是什么?当我们在体积变量中而不是在“b”中添加项目时,它不应该是“b中的i”吗?