我找到了以下代码段:
length = length and length or len(string)
对我看来,这应该等同于:
length = length or len(string)
我可以将表达式length and length
折叠为length
,还是在某些情况下会得到不同的结果?
答案 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
,因此这两个表达式是等效的。