1

我正在 UserList 中创建一个新类,并尝试覆盖add、 append 和 extend 方法,这样任何这些操作都不会将重复值添加到列表中。到目前为止,我已经开始尝试覆盖 append 方法,当我尝试在对象上实现该类时,我得到了错误:超出了最大递归深度。这是我到目前为止所拥有的:

from collections import UserList

class UList(UserList):
  def append(self,item):
      for s in self:
          if item == s:
              print ("Item already exists in list")
          else:
              self.append(item)


x = [1,2,3,4,5]
z = UList(x)
print (z)
z.append(1)
4

2 回答 2

2

您正在递归调用相同的方法,调用基类的append方法以防止无限递归:

py2.x:

super(UList, self).append(item)

py3.x:

super().append(item)

使用in运算符而不是遍历整个列表来检查项目的存在。

代码:

from collections import UserList

class UList(UserList):
  def append(self, item):
      if item in self:
          print ("Item already exists in list")
      else:
          super(UList, self).append(item) # just `super().append(item)` in py3.x
于 2013-09-13T16:40:59.757 回答
1

好吧,考虑一下。你已经在self.append()。然后你打电话self.append()。这是一个递归,下次通过代码时,什么都没有改变(该项目仍然不在列表中)所以你一次又一次地递归最终,Python 用完了堆栈空间来存储你的状态递归,你得到错误。

不要打电话self.append()。你必须调用基类方法,因为你不能做追加。

def append(self, item):
    for s in self:
        if item == s:
            print ("Item already exists in list")
        else:
            UserList.append(self, item)

您也可以使用super()它,但在这种情况下并非绝对必要;super()在多继承场景中至关重要,但在更简单的情况下,我发现显式调用基类更清晰。

另一点是遍历整个列表以查看您的项目是否在其中是浪费时间。相反,只需执行以下操作:

def append(self, item):
    if item in self:
        print("Item already exists in list")
    else:
        UserList.append(self, item)

append()您可能还会重新考虑在您的方法中打印错误。最好引发异常,以便使用您的类的代码可以检测到错误并根据需要进行处理。您还可以使错误消息更具描述性,以便说明找到的重复项。

def append(self, item):
    if item in self:
        raise ValueError(repr(item) + " already exists in list")
    else:
        UserList.append(self, item)

set()如果您不需要维护订单,您也可以考虑使用 a 。它不存储重复项,因此您只需添加项目,您将永远不会得到重复项;你不必先检查。

于 2013-09-13T16:44:50.220 回答