在列表对象上调用IF语句时会发生什么?调用什么方法确定是对还是错?

时间:2019-03-26 01:52:40

标签: python

在列表对象的实例上调用IF语句时,是否存在用于评估返回True还是False的魔术方法?例如,

a = []
b = [1, 2, 3]

if a == b:  #  <---- __eq__() is called and returns False
    pass

if a:       #  <---- what is called here that returns False?
    pass

是吗? a .__ bool__(a .__ nonzero__)? a .__ len __?

还是其他东西?

5 个答案:

答案 0 :(得分:2)

实验时间!

class Falsy:
    def __nonzero__(self):
        print("it's __nonzero__")
        return False
    def __len__(self):
        print("it's __len__")
        return 0
    def __bool__(self):
        print("it's __bool__")
        return False
    def __eq__(self, other):
        print("it's __eq__")
        return False

if Falsy():
    pass

# => it's __bool__

您可以尝试删除这些方法,以确认对它们进行测试的优先级(对于Python 3,__bool__,然后是__len__)。

答案 1 :(得分:2)

@ymonad只需参考以下文档即可在问题的评论中提供最佳答案:

https://docs.python.org/3/library/stdtypes.html#truth-value-testing

我不想为此感到荣誉。当最佳答案甚至不是答案时,我就是无法解决。如果可以简单地指向文档,那将永远是最好的答案。

... grrrr ...嘿@ymonad,我能给你赏金或其他什么吗,大声笑?

答案 2 :(得分:0)

摘自文档https://docs.python.org/2/reference/datamodel.html#object.nonzero

__exit__

被调用以实现真值测试和内置操作object.__nonzero__(self);应该返回bool()False或它们的等效整数True0。如果未定义此方法,则调用1(如果已定义),并且如果其结果为非零,则认为该对象为true。如果某个类既未定义__len__()也未定义__len__(),则其所有实例均被视为true。

对于Python 3 https://docs.python.org/3.7/reference/datamodel.html#object.nonzero

__nonzero__()

被调用以实现真值测试和内置操作object.__bool__(self);应该返回bool()False。如果未定义此方法,则调用True(如果已定义),并且如果其结果为非零,则认为该对象为true。如果某个类既未定义__len__()也未定义__len__(),则其所有实例均被视为true。

尝试:

__bool__()

答案 3 :(得分:0)

咨询PyList的C-Python API文档...

https://docs.python.org/3.7/c-api/list.html

...我们可以看到没有列表特定的“ as bool”功能。唯一可以返回“真”值的是PyList_Size(PyObject *list),因此答案必须为a.__len__()

免责声明:至少对于CPython。

答案 4 :(得分:-1)

您可能想参考this answer

我不确定您的意思。如果我假设您正在寻找Java的.equals()等效项,我要说的是,python中没有这样的东西。

在python中,空列表始终为False。