在python中ANDing两个对象的输出是什么

时间:2014-01-02 17:46:35

标签: python object

如果我们和两个相同类型的对象的预期输出是什么? 如果我们有两个Node类型的对象,如下所述

    class Node(object):
        def __init__(self,parent,k):
            self.key = k
            self.parent = parent
            self.left = None
            self.right = None

如果我们和Node类型的对象有什么样的输出?如果我们和预定义类型的对象会发生什么?

5 个答案:

答案 0 :(得分:3)

andor将评估到最后评估的表达式。如果and的左侧是True,则会返回右侧。如果or的左侧是False,则会返回右侧。

要为班级定义“真相”,请将__len____nonzero__覆盖为described in the docs

答案 1 :(得分:1)

考虑以下示例

a = Node(1, None)
b = Node(1, 2)
result = a and b

print "a=%s" % id(a)
print "b=%s" % id(b)
print "result=%s" % id(result)

打印

a=2329884
b=2311540
result=2311540

如果我们预定义类型,结果相同。

这样做的原因是,当在布尔表达式中比较对象引用时(默认情况下)会检查它们是否存在,就像对象是那样它会产生在布尔表达式中为假,如果它不是None,那么它将产生 True 。 对于这些表达式,python检查第一个对象是然后返回,否则返回第二个对象。 此表达式等效于此代码示例

result = None if a is None else b

的情况类似,可以写成

result = b if a is None else a

result = a or b

答案 2 :(得分:0)

对于你在那里定义的类Nodeand表达式的结果是两个操作数中的第二个,其两个操作数都是Node的实例。 or的结果是第一个。

原因是Node的所有实例都是“真实的”,这意味着它们在逻辑测试的上下文中评估为真。此外,and返回其第一个操作数,如果它是“假”,否则返回第二个操作数,而or返回其第一个操作数,如果它是“truthy”,否则返回第二个操作数。

其他类不一定共享Node的这个属性,所有实例都是“真实的”。例如,空list为“falsey”,对象None和整数0也是如此。您可以通过在Python 2中实现特殊方法__nonzero__或在Python 3中实现__bool__来控制它。或者您可以通过在两者中实现__len__来控制它。

答案 3 :(得分:0)

class Node(object):
    def __init__(self,parent,k):
        self.key = k
        self.parent = parent
        self.left = None
        self.right = None

a = Node(None,None)
b = Node(None,None)

a and b #will return the object in memory of b

if a and b: print("True")
>>> True

and将返回返回False中的第一个对象,如果所有对象都返回True,则返回最后一个对象。 or将返回返回True的第一个对象,如果所有对象都返回False,则返回最后一个对象

答案 4 :(得分:0)

如果你这样做:

A = Node(None, 'key1')
B = Node(None, 'key2')

然后

A & B

将致电

A.__and__(B)

通常,这没有实现,并会抛出异常。但是,该类可以定义您想要的任何行为。 (另见rand

(如前所述,

A and B

布尔表达式,将评估A和B的“真值”,然后从中评估true / false。通常,有效对象为True)。