我找到了以下代码片段:
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,因此这两个表达式是等价的。