2013-02-14 139 views
1

我发现下面的代码片段:“长度和长度”与Python中的“长度”有什么不同?

length = length and length or len(string) 

要我看来,这应该是等同于:

length = length or len(string) 

我可以折叠的表达length and length仅仅是length或者我会得到在某些情况下有不同的结果?

+0

'如果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

+0

@MartijnPieters是的,我错了!但是,似乎该语句不考虑“length”或“string”的值而使“length”的值保持不变。我不知道威廉在哪里看到了代码片段... – pradyunsg 2013-02-14 18:26:10

+0

@MartijnPieters刷新了一点时间...... :) – pradyunsg 2013-02-14 18:30:24

回答

3

这条线是无稽之谈。让我们来看看我们的选项:

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

+0

......这正是他所问的。我很高兴你更正了你的答案,我正要抱怨。 – 2013-02-14 18:33:34

+0

@ChrisMorgan:'+++出咖啡因错误+++从开始+++重做'。 – 2013-02-14 18:34:16

+0

对不起,Python本身不支持异常机制中的“重试”构造。尝试一种不同的语言。 – 2013-02-14 18:35:18

2

length and length or len(string)完全等同于length or len(string)。我认为,编写此代码的人希望在length为虚假时避免拨打len(string),但事实并非如此。例如:

>>> None and None or len('foo') 
3 

由于andor有更高的优先级,我们可以重写表达式如下:

(length and length) or len('foo') 

length and length将始终评估为length,所以这两个表达式是相同的。

+3

*我认为正在做的事情是作者熟悉“x和y或z”几乎是三元的表达习惯用法,只是没有想到就应用了它。 – 2013-02-14 18:34:17