如果我们和两个相同类型的对象的预期输出是什么? 如果我们有两个Node类型的对象,如下所述
class Node(object):
def __init__(self,parent,k):
self.key = k
self.parent = parent
self.left = None
self.right = None
如果我们和Node类型的对象有什么样的输出?如果我们和预定义类型的对象会发生什么?
答案 0 :(得分:3)
and
和or
将评估到最后评估的表达式。如果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)
对于你在那里定义的类Node
,and
表达式的结果是两个操作数中的第二个,其两个操作数都是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)。