for循环中的__getitem__调用

Luk*_*don 3 python

我正在学习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
Run Code Online (Sandbox Code Playgroud)

和输出

index 0
2
index 1
1
index 2
0
index 3
Run Code Online (Sandbox Code Playgroud)

为什么getitem被召唤四次?

kin*_*all 11

for循环不知道如何具体,因为你还没有实现你的对象迭代__iter__(),所以它使用默认迭代器.这从索引0开始,一直到IndexError索引索引3.请参阅http://effbot.org/zone/python-for-statement.htm.

list顺便说一下,如果你派生出来,你的实现会简单得多.你不需要__init__(),pop()__getitem__(),也push可能只是另一个名字append.此外,由于list有一个非常好的__iter()__方法,for将知道如何迭代它而不超过列表的末尾.

class Stack(list):
    push = list.append
Run Code Online (Sandbox Code Playgroud)