在循环中调用__getitem__

5 投票
1 回答
2697 浏览
提问于 2025-04-17 08:01

我正在学习Python,有一点我不太明白。考虑这段代码:

class Stack:
   def __init__(self):
        self.items = []

   def push(self, item):
       self.items.append(item)

   def pop(self):
       return self.items.pop()

   def __getitem__(self,index):
       print "index",index
       return self.items[index]

   def __len__(self):
       return len(self.items)


stack = Stack()
stack.push(2)
stack.push(1)
stack.push(0)

for item in stack:
    print item

还有它的输出:

index 0
2
index 1
1
index 2
0
index 3

为什么getitem会被调用四次呢?

1 个回答

14

这个 for 循环不知道怎么处理你的对象,因为你没有实现 __iter__() 方法,所以它只能使用默认的迭代器。这个默认迭代器从索引0开始,一直进行到请求索引3时出现 IndexError 错误为止。你可以查看这个链接了解更多信息:http://effbot.org/zone/python-for-statement.htm

顺便说一下,如果你直接从 list 继承的话,事情会简单很多。你就不需要写 __init__()pop()__getitem__() 方法,而 push 也可以直接用 append 来代替。而且,因为 list 有一个很好的 __iter()__ 方法,所以 for 循环会知道怎么迭代这个列表,而不会超出列表的范围。

class Stack(list):
    push = list.append

撰写回答