我正在学习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 被调用四次?
答案 0 :(得分:11)
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