【问题标题】:python - condensing comparisonspython - 浓缩比较
【发布时间】:2011-10-06 17:37:25
【问题描述】:

我是这里的新成员,也是 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':

【问题讨论】:

  • 最后一个问题,答案是if x==y=='whatever'
  • 表示:内存中有一个字符串对象,其值为'whatever',引用指向的对象名称为x,指向的对象通过名称为 y 的引用是相同的值“whatever”对象。 xy 是标识符,也就是说字符串是变量的名称,其性质是指针,这些指针指向对象 xy。 Python的数据模型是:x标识符,名称为x的底层指针(Python中称为引用),引用指向对象x .这样想,你就没有问题了

标签: python comparison comparison-operators


【解决方案1】:

or 不像英语那样工作。

x or y 如果 x 为真值,则返回 x,否则返回 y。如果字符串不为空,则字符串为真。

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

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

你想要这个(括号可选):

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

或更简洁,但更陌生:

if 'whatever' in [x, y]:

【讨论】:

  • 也许我已经太久了,但我不明白最后一点有多奇怪。
  • x or y 如果为真则返回x,否则返回y。它不会返回False,除非x 为假且y 本身为False
  • @IgnacioVazquez-Abrams:是的!我走得太快了,修好了。
【解决方案2】:

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。然后将其结果与“whatever”进行比较。

无论如何,您永远不应该将字符串与is 进行比较。应使用== 比较字符串。是指一些不同的东西,有时会偶然起作用。

你的实际请求可以写成:

if 'whatever' in [x,y]:

这会检查字符串是否在列表[x,y]中。

【讨论】:

    【解决方案3】:

    我认为这可行:

    if "whatever" in (x, y):
    

    这有点奇怪。

    【讨论】:

      【解决方案4】:
      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)
      

      你可能有

      if 'whatever' in (x, y)
      

      或者,如果条件列表较长,最好使用“any”函数:

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

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

      更新:

      考虑到 'is' 实际上是在比较内存地址,并且(正如 here 指出的那样)在字符串上使用它不是一个好习惯。

      【讨论】:

      • 嗯,我没有发现第二种情况总是错误的,至少在解释器中。
      • 薄是正确的。 Python 的“x 或 y”版本返回 x,y 中的任何一个,而不是实际的布尔值。另外,与仅在整个列表中使用 in 相比,您的 any 构造有什么意义?另外,您仍然说在第三行使用 is 是有效且正确的。 (好吧,是的,我在这里是一个坚持者)
      • @WinstonEwert 我的观点更清楚了(希望如此!):问题是关于压缩条件语句,所以我说得更笼统一些;从某种意义上说,在这种情况下,“[x,y] 中的‘whatever’”就足够了。
      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多