我发现下面的代码片段:“长度和长度”与Python中的“长度”有什么不同?
length = length and length or len(string)
要我看来,这应该是等同于:
length = length or len(string)
我可以折叠的表达length and length
仅仅是length
或者我会得到在某些情况下有不同的结果?
我发现下面的代码片段:“长度和长度”与Python中的“长度”有什么不同?
length = length and length or len(string)
要我看来,这应该是等同于:
length = length or len(string)
我可以折叠的表达length and length
仅仅是length
或者我会得到在某些情况下有不同的结果?
这条线是无稽之谈。让我们来看看我们的选项:
length
是falsy(所以0
,一个空列表,空字符串,等等)。 Python将返回length
的值,因为无论右侧的计算结果如何,and
运算符评估为False
都没有意义,因为没有必要查看表达式的其余部分。然后测试length or len(string)
并返回len(string)
。
length
不是假的。 Python评估length and length
,将其解析为length
的值,然后测试length or len(string)
,并且因为length
是truthy,返回length
。毕竟,or
现在总是会解决到True
,并没有看点len(string)
。
这基本上可以归结为length = length or len(string)
,该length and length
是无操作。
......这正是他所问的。我很高兴你更正了你的答案,我正要抱怨。 – 2013-02-14 18:33:34
@ChrisMorgan:'+++出咖啡因错误+++从开始+++重做'。 – 2013-02-14 18:34:16
对不起,Python本身不支持异常机制中的“重试”构造。尝试一种不同的语言。 – 2013-02-14 18:35:18
length and length or len(string)
完全等同于length or len(string)
。我认为,编写此代码的人希望在length
为虚假时避免拨打len(string)
,但事实并非如此。例如:
>>> None and None or len('foo')
3
由于and
比or
有更高的优先级,我们可以重写表达式如下:
(length and length) or len('foo')
length and length
将始终评估为length
,所以这两个表达式是相同的。
*我认为正在做的事情是作者熟悉“x和y或z”几乎是三元的表达习惯用法,只是没有想到就应用了它。 – 2013-02-14 18:34:17
'如果length:length = length或len(string)else:length = False'将等于您的'length = length和length或len(string)'。而且,'length或len(string)'可以给出'len(string)'的值。 – pradyunsg 2013-02-14 18:20:56
@MartijnPieters是的,我错了!但是,似乎该语句不考虑“length”或“string”的值而使“length”的值保持不变。我不知道威廉在哪里看到了代码片段... – pradyunsg 2013-02-14 18:26:10
@MartijnPieters刷新了一点时间...... :) – pradyunsg 2013-02-14 18:30:24