2011-10-06 106 views
3

我是这里的新成员,也是python的新成员。我的问题如下,是否有这样的线?蟒蛇 - 浓缩比较

if x or y is 'whatever': 

我在解释器中测试了这个,并得到了不一致的结果。这似乎是这条线产生更加一致和预期结果

if (x or y) is 'whatever': 

或者是它总是最好明确地拥有一切奠定了这样

if x is 'whatever' or y is 'whatever': 

这最后一个总是工作,但我只是想使我的代码更加简洁,同时遵循最佳实践。我试图做一个搜索,以免提出多余的问题,但是搜索'是''或'和'和'是非常困难的。预先感谢您的帮助。

编辑:感谢所有的快速回复。这对我来说完全适合我需要'或'

if 'whatever' in [x,y]: 

但是,如果我需要一个'和',我该如何压缩这个?

if x == 'whatever' and y == 'whatever': 
+0

回答最后一个问题,答案是“if x == y =='whatever''' – eyquem

+0

这意味着:内存中有一个字符串对象,其值为'whatever',对象指向名称为_x_的引用和名称为_y_的引用指向的对象是值为'whatever'的相同对象。 _x_和_y_是标识符,也就是说字符串是变量的名称,其本质是指针,这些指针指向对象** x **和** y **。 Python的数据模型是:_x_标识符,名为_x_的基础指针(在Python中称为引用),引用指向对象** x **。想想那样,你就没有问题了 – eyquem

回答

8

or不能像英文那样工作。

x or y如果x是真实值,则返回x,否则返回y。如果字符串不是空的,它们是真实的。

更糟糕的是,“是”的优先级高于“或”,所以您的表达与x or (y is 'whatever')相同。所以如果x不为空,它返回x(这将是真实的,所以if将执行)。如果x是空的,它将评估y is 'whatever'

顺便说一句:不要使用“是”来比较值相等,使用==。

你想这样(的括号可选):

if (x == 'whatever') or (y == 'whatever'): 

或更简洁,但陌生人:

if 'whatever' in [x, y]: 
+2

也许我一直在这太长时间,但我不明白最后一点如何是奇怪的。 –

+1

如果x或y为真,则返回'x',否则返回'y'。它不会返回'False',除非'x'为false,'y'本身为'False' –

+0

@ IgnacioVazquez-Abrams:是的!我太快了,修好了。 –

1

,我认为这会工作:

if "whatever" in (x, y): 

这是一种奇怪的虽然。

3

Python不是英文。

if x or y is 'whatever': 

指:

if x or (y is 'whatever'): 

哪个是X是真或Y为 '无论'

if (x or y) is 'whatever': 

x or y变为x或y。如果x为真,那么它返回X,否则它变成Y.然后将结果与“无论”进行比较。

反正你永远不应该比较字符串与is。字符串应使用==进行比较。意味着有时会偶然发生意外。

您实际要求可以写成:

if 'whatever' in [x,y]: 

此检查是否字符串无论是在列表[x,y]

1
if x or y is 'whatever' # this is akin to if x or (y is 'whatever') 

if (x or y) is 'whatever': # (x or y) returns the first non-false value... 

if x is 'whatever' or y is 'whatever': # this is valid and correct (aside from the fact you shouldn't be using `is`, see below) 

你可能有

​​

,或者在条件列表较长的情况下,这是很好的使用“any”功能:

if any([condition(k) for k in list]) 

但它是矫枉过正的因为你只是想知道[x,y]中是否包含'whatever'。

UPDATE:

认为“是”实际上是比较的内存地址,(如指出here)它不是把它用在串好的做法。

+0

-1未能正确使用'is' –

+0

@WinstonEwert谢谢,确实确定 –

+0

嗯,我没有发现第二种情况总是错误的,至少在翻译中是这样。 – thinc