是否有理由list.append
评估为假?或者只是在成功发挥作用时返回0的C约定?
>>> u = []
>>> not u.append(6)
True
答案 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)
它就地修改列表,并返回None
。 None
评估为假。
答案 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}}