【问题标题】:Python list remove method: how's the implementation?Python list remove 方法:实现如何?
【发布时间】:2010-07-23 19:24:14
【问题描述】:

在 java 中,我的客户端类具有“代码”属性和 equals 方法。方法equals接收另一个客户端,并与自己的code attr进行比较。

在 python 中,我刚刚读到我们有 __cmp__ 方法,与 java 方法 equals 一样。好的,我做到了。我创建了我的类客户端,使用“code”attr 和方法 comp 来验证代码是否相同。

class Client():
    def __init__(self, code):
        self.code = code

    def __cmp__(self, obj):
        return obj.code == self.code

    def __repr__(self):
        return str(self.code)

然后我将 3 个 Client 对象放入 python 的列表中:

bla = [Client(1), Client(2), Client(3)]

然后,当我尝试时:

bla.remove(Client(3))

神奇的 python 删除了第一个元素(代码为 1 的客户端)。

我做错了什么?我在python的lib文件中搜索了list的实现,但是不好找。

有人可以帮忙吗?

【问题讨论】:

  • 该方法称为__cmp__。也许您可以展示您对该方法的实现?
  • @Daniel 您的评论很可能包含正确答案。考虑将其复制为实际答案,以便我们为您投票。

标签: python list compare


【解决方案1】:

http://docs.python.org/reference/datamodel.html#object.__cmp__

__cmp__(self, other)

由比较操作调用 if 丰富的比较(见上文)不是 定义。应该返回负数 如果 self other,则为正整数。

基本上,您应该将__cmp__ 的实现更改为...

def __cmp__(self, obj):
    return cmp(obj.code, self.code)

Python 的 cmp() 内置函数专门设计用于返回 __cmp__ 通过比较其两个参数预计返回的值。

Python 中还有一个名为 __eq__ 的不同函数,它只检查相等性,您当前的 __cmp__ 实现更适合。

【讨论】:

    【解决方案2】:

    听起来你真的想要__eq__

    class Client():
        def __init__(self, code):
            self.code = code
    
        def __eq__(self, obj):
            return obj.code == self.code
    
        # this is how you usually write cmp, Amber explained the problem
        def __cmp__(self, other):
            return cmp(self.code, other.code)
    
        def __repr__(self):
            return str(self.code)
    

    顺便说一句,在您的错误示例中发生的情况是 __cmp__ 按预期返回 False。但是在 Python 中 False == 0 并从 __cmp__ 返回 0 意味着比较的元素是相等的。所以这就是它删除第一个元素的原因!

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多