我找到了以下代码片段:
length = length and length or len(string)
在我看来,这应该相当于:
length = length or len(string)
我可以将表达式折叠length and length
为只是,length
还是在某些情况下会得到不同的结果?
我找到了以下代码片段:
length = length and length or len(string)
在我看来,这应该相当于:
length = length or len(string)
我可以将表达式折叠length and length
为只是,length
还是在某些情况下会得到不同的结果?
这条线是胡说八道。让我们看看我们有哪些选择:
length
是假的(所以0
,一个空列表,一个空字符串等)。Python 将返回 of 的值,length
因为当and
运算符计算False
右侧的计算结果时,查看表达式的其余部分是没有意义的。然后它测试length or len(string)
并返回len(string)
。
length
不是假的。Python 评估length and length
,将其解析为 的值length
,然后测试length or len(string)
,并且因为length
是真实的,所以返回length
。毕竟,or
现在总是会解决,True
而且没有任何意义len(string)
。
这基本上归结为length = length or len(string)
,length and length
是无操作的。
length and length or len(string)
完全等价于length or len(string)
。我认为编写此代码的人希望它在错误len(string)
时避免调用length
,但事实并非如此。例如:
>>> None and None or len('foo')
3
由于and
优先级高于or
,我们可以将表达式改写如下:
(length and length) or len('foo')
length and length
将始终计算为length
,因此这两个表达式是等价的。