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 Trybool(None)
@Chris_RandsNone
不是布尔值,这就是为什么需要使用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))
?@Stefanappend()
和extend()
有不同的效果,而不是interchangeable@javadba有什么区别?“我的扩展”与您的两个附录具有相同的效果。如果元素是列表,则extend()将保留单个列表,而append()将是列表的列表。在上面的例子中,它们不是这样的,所以这是一个特殊的例子,在extend()和append()之间是相同的。这也破坏了builder()
模式。这是python难以使用的众多原因之一。