是"长度和长度"任何不同于"长度"在Python?

时间:2013-02-14 18:15:14

标签: python refactoring collapse equivalent

我找到了以下代码段:

length = length and length or len(string)

对我看来,这应该等同于:

length = length or len(string)

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

2 个答案:

答案 0 :(得分:3)

这句话是无稽之谈。我们来看看我们的选项:

  • length是假的(所以0,空列表,空字符串等)。 Python将返回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是无操作。

答案 1 :(得分: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,因此这两个表达式是等效的。