为什么list.append在布尔上下文中求值为false?

时间:2009-11-05 18:24:10

标签: python list

是否有理由list.append评估为假?或者只是在成功发挥作用时返回0的C约定?

>>> u = []
>>> not u.append(6)
True

7 个答案:

答案 0 :(得分:37)

大多数使用原位变异容器的Python方法返回None - Command-query separation原则的应用。 (Python对事物的处理总是相当实用,所以一些mutator在获得它时会返回一个可用的值,否则会很昂贵或一团糟 - pop方法就是这种实用主义的一个很好的例子 - 但这些肯定是异常,而不是规则,并且没有理由使append成为异常。)

答案 1 :(得分:20)

None计算结果为False,而在python中,假定一个不返回任何内容的函数返回None

如果输入:

>> print u.append(6)
None

Tadaaam:)

答案 2 :(得分:6)

因为.append方法返回None,因此not None评估为True。 Python出错时通常会引发错误:

>>> a = ()
>>> a.append(5)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    a.append(5)
AttributeError: 'tuple' object has no attribute 'append'

答案 3 :(得分:5)

它就地修改列表,并返回NoneNone评估为假。

答案 4 :(得分:3)

实际上,它会返回None


>>> print u.append(6)
None
>>> print not None
True
>>> 

答案 5 :(得分:1)

方法append就地修改列表并返回值None

在你的情况下,你正在创建一个数组 - [6] - 在运行中,然后丢弃它。变量b最终返回None。

为什么?
这符合Bertrand Meyer设计的Command–query separation原则 它声明每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是两者。 在您的示例中:

u.append(6)

append修改了[]的状态,因此返回符合原则的值不是最佳做法。

从理论上讲,这可以建立一种理智的度量,从而可以在不同时修改该状态的情况下推理程序的状态。

CQS非常适合面向对象的方法,如python。

答案 6 :(得分:0)

None函数确实返回>>> u = [] >>> not u False >>> print(u.append(6)) # u.append(6) == None None >>> not u.append(6) # not None == True True ,它只是将值添加到您用来调用该方法的列表中。

这是让事情更清晰的事情:

{{1}}