Python 为什么list.append在布尔上下文中计算为false?

Python 为什么list.append在布尔上下文中计算为false?,python,list,Python,List,是否存在将list.appendevaluation添加到false的原因?或者,这只是成功返回0的C约定开始发挥作用 >>> u = [] >>> not u.append(6) True None的计算结果为False,在python中,不返回任何内容的函数被假定为返回了None 如果键入: >> print u.append(6) None Tadaaam:)它就地修改列表,并返回NoneNone计算结果为false。因为.append方

是否存在将
list.append
evaluation添加到false的原因?或者,这只是成功返回0的C约定开始发挥作用

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

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

如果键入:

>> print u.append(6)
None

Tadaaam:)

它就地修改列表,并返回
None
None
计算结果为false。

因为
.append
方法返回
None
,因此
非None
计算结果为
True
。Python on error通常会引发错误:

>>> 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'
>a=()
>>>a.1(5)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
a、 附加(5)
AttributeError:“tuple”对象没有属性“append”

实际上,它返回
None


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

大多数对容器进行就地变异的Python方法都返回
None
——这是对。(Python对事物总是相当务实的,因此当获取可用值时,一些变体确实会返回一个可用值,否则会很昂贵或混乱,
pop
方法就是这种务实主义的一个很好的例子——但这些绝对是例外,而不是规则,没有理由将
append
作为例外).

列表.append函数返回
None
。它只是将值添加到调用方法的列表中

这里有一些东西可以让事情变得更清楚:

>>> u = []
>>> not u
False
>>> print(u.append(6)) # u.append(6) == None
None    
>>> not u.append(6) # not None == True
True

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

在您的例子中,您正在动态创建一个数组-[6],然后丢弃它。变量b以返回值None结束

为什么?
这符合Bertrand Meyer所设计的设计原则。
它指出,每个方法要么是执行操作的命令,要么是向调用方返回数据的查询,但不能两者兼而有之。 在您的示例中:

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

从理论上讲,这建立了一种理智的衡量标准,人们可以在不同时修改程序状态的情况下对程序状态进行推理


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

更新列表的变量(如追加、扩展、排序等)不会返回值。
None
不会计算为
False
@SwiftsNamesake Try
bool(None)
@Chris_Rands
None
不是布尔值,这就是为什么需要使用
bool
函数来转换它(由
not
隐式完成)。是的,我知道这是一个诡辩,但它是
True
。@SwiftsNamesake的计算结果比Python自己的语义更清晰,
help(bool)
说“bool(x):当参数x为True时返回True”。但是
x
是真的似乎太类似于
x是真的
,这当然有一个完全不同的含义。我在写(y.append(5)和(yield y))时遇到了这个问题,我没想到会(间接地)成功添加列表计算为false。一种可能更好的表达方式:python为什么不使用
Builder
模式。。所以我们可以做
u.append(6)。append(7)
这很烦人。@javadba为什么不干脆做
u.extend((6,7))
?@Stefan
append()
extend()
有不同的效果,而不是interchangeable@javadba有什么区别?“我的扩展”与您的两个附录具有相同的效果。如果元素是列表,则extend()将保留单个列表,而append()将是列表的列表。在上面的例子中,它们不是这样的,所以这是一个特殊的例子,在extend()和append()之间是相同的。这也破坏了
builder()
模式。这是python难以使用的众多原因之一。