1

我找到了以下代码片段:

length = length and length or len(string)

在我看来,这应该相当于:

length = length or len(string)

我可以将表达式折叠length and length为只是,length还是在某些情况下会得到不同的结果?

4

2 回答 2

3

这条线是胡说八道。让我们看看我们有哪些选择:

  • 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是无操作的。

于 2013-02-14T18:27:44.410 回答
2

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,因此这两个表达式是等价的。

于 2013-02-14T18:22:49.797 回答